Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 150 additions & 0 deletions api/src/Feature.Statistics/GetElectionRoundStatistics/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,148 @@ AND PS."Level5" IS NOT NULL
INNER JOIN "PollingStationsPerLevel" PS ON S."Level" = PS."Level" AND S."Path" = PS."Path"
INNER JOIN "ActiveObserversPerLevel" AOL ON S."Level" = AOL."Level" AND S."Path" = AOL."Path";

WITH
"LocationStatsRaw" AS (
SELECT
CR."LocationId",
COUNT(1) AS "NumberOfCitizenReports",
SUM(CR."NumberOfFlaggedAnswers") AS "NumberOfFlaggedAnswers",
SUM(CR."NumberOfQuestionsAnswered") AS "NumberOfQuestionsAnswered"
FROM "CitizenReports" CR
WHERE CR."ElectionRoundId" = @electionRoundId
AND CR."NumberOfQuestionsAnswered" > 0
GROUP BY CR."LocationId"
),
"ElectionLocations" AS (
SELECT
L."Id",
NULLIF(L."Level1", '') AS "Level1",
NULLIF(L."Level2", '') AS "Level2",
NULLIF(L."Level3", '') AS "Level3",
NULLIF(L."Level4", '') AS "Level4",
NULLIF(L."Level5", '') AS "Level5"
FROM "Locations" L
WHERE L."ElectionRoundId" = @electionRoundId
AND L."Level1" != ''
),
"LocationsPerLevel" AS (
SELECT
CASE
WHEN GROUPING(L."Level1") = 1 THEN 0
WHEN GROUPING(L."Level2") = 1 THEN 1
WHEN GROUPING(L."Level3") = 1 THEN 2
WHEN GROUPING(L."Level4") = 1 THEN 3
WHEN GROUPING(L."Level5") = 1 THEN 4
ELSE 5
END AS "Level",
CASE
WHEN GROUPING(L."Level1") = 1 THEN '/'
ELSE CONCAT_WS(' / ', L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
END AS "Path",
COUNT(L."Id") AS "NumberOfLocations"
FROM "ElectionLocations" L
GROUP BY GROUPING SETS (
(),
(L."Level1"),
(L."Level1", L."Level2"),
(L."Level1", L."Level2", L."Level3"),
(L."Level1", L."Level2", L."Level3", L."Level4"),
(L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
)
HAVING
GROUPING(L."Level1") = 1
OR (
GROUPING(L."Level2") = 1
AND L."Level1" IS NOT NULL
)
OR (
GROUPING(L."Level3") = 1
AND GROUPING(L."Level2") = 0
AND L."Level2" IS NOT NULL
)
OR (
GROUPING(L."Level4") = 1
AND GROUPING(L."Level3") = 0
AND L."Level3" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 1
AND GROUPING(L."Level4") = 0
AND L."Level4" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 0
AND L."Level5" IS NOT NULL
)
),
"LocationLevelsStats" AS (
SELECT
CASE
WHEN GROUPING(L."Level1") = 1 THEN 0
WHEN GROUPING(L."Level2") = 1 THEN 1
WHEN GROUPING(L."Level3") = 1 THEN 2
WHEN GROUPING(L."Level4") = 1 THEN 3
WHEN GROUPING(L."Level5") = 1 THEN 4
ELSE 5
END AS "Level",
CASE
WHEN GROUPING(L."Level1") = 1 THEN '/'
ELSE CONCAT_WS(' / ', L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
END AS "Path",
COUNT(LS."LocationId") AS "NumberOfVisitedLocations",
COALESCE(SUM(LS."NumberOfCitizenReports"), 0) AS "NumberOfCitizenReports",
COALESCE(SUM(LS."NumberOfFlaggedAnswers"), 0) AS "NumberOfFlaggedAnswers",
COALESCE(SUM(LS."NumberOfQuestionsAnswered"), 0) AS "NumberOfQuestionsAnswered"
FROM "LocationStatsRaw" LS
INNER JOIN "ElectionLocations" L ON L."Id" = LS."LocationId"
GROUP BY GROUPING SETS (
(),
(L."Level1"),
(L."Level1", L."Level2"),
(L."Level1", L."Level2", L."Level3"),
(L."Level1", L."Level2", L."Level3", L."Level4"),
(L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
)
HAVING
GROUPING(L."Level1") = 1
OR (
GROUPING(L."Level2") = 1
AND L."Level1" IS NOT NULL
)
OR (
GROUPING(L."Level3") = 1
AND GROUPING(L."Level2") = 0
AND L."Level2" IS NOT NULL
)
OR (
GROUPING(L."Level4") = 1
AND GROUPING(L."Level3") = 0
AND L."Level3" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 1
AND GROUPING(L."Level4") = 0
AND L."Level4" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 0
AND L."Level5" IS NOT NULL
)
)
SELECT
S."Path",
S."Level",
S."NumberOfVisitedLocations",
L."NumberOfLocations",
S."NumberOfCitizenReports",
S."NumberOfFlaggedAnswers",
S."NumberOfQuestionsAnswered",
(
S."NumberOfVisitedLocations" * 100.0 / NULLIF(L."NumberOfLocations", 0)
) AS "CoveragePercentage"
FROM "LocationLevelsStats" S
INNER JOIN "LocationsPerLevel" L ON S."Level" = L."Level" AND S."Path" = L."Path";

WITH "AvailableObservers" AS (
SELECT MO."Id" AS "MonitoringObserverId"
FROM "MonitoringObservers" MO
Expand Down Expand Up @@ -440,6 +582,7 @@ SELECT MO."Id" AS "MonitoringObserverId"
NgosStats ngosStats;
ObserversStats observersStats;
List<VisitedPollingStationLevelStats> visitedPollingStationsStats;
List<VisitedLocationLevelStats> visitedLocationStats;
List<FormSubmissionsHistogramPoint> formSubmissionsHistogram;
List<HistogramPoint> quickReportsHistogram;
List<HistogramPoint> citizenReportsHistogram;
Expand All @@ -452,6 +595,7 @@ SELECT MO."Id" AS "MonitoringObserverId"
ngosStats = multi.ReadSingle<NgosStats>();
observersStats = multi.ReadSingle<ObserversStats>();
visitedPollingStationsStats = multi.Read<VisitedPollingStationLevelStats>().ToList();
visitedLocationStats = multi.Read<VisitedLocationLevelStats>().ToList();
formSubmissionsHistogram = multi.Read<FormSubmissionsHistogramPoint>().ToList();
quickReportsHistogram = multi.Read<HistogramPoint>().ToList();
citizenReportsHistogram = multi.Read<HistogramPoint>().ToList();
Expand All @@ -468,6 +612,12 @@ SELECT MO."Id" AS "MonitoringObserverId"
Level3Stats = visitedPollingStationsStats.Where(x => x.Level == 3).ToList(),
Level4Stats = visitedPollingStationsStats.Where(x => x.Level == 4).ToList(),
Level5Stats = visitedPollingStationsStats.Where(x => x.Level == 5).ToList(),
TotalLocationStats = visitedLocationStats.FirstOrDefault(x => x.Level == 0),
LocationLevel1Stats = visitedLocationStats.Where(x => x.Level == 1).ToList(),
LocationLevel2Stats = visitedLocationStats.Where(x => x.Level == 2).ToList(),
LocationLevel3Stats = visitedLocationStats.Where(x => x.Level == 3).ToList(),
LocationLevel4Stats = visitedLocationStats.Where(x => x.Level == 4).ToList(),
LocationLevel5Stats = visitedLocationStats.Where(x => x.Level == 5).ToList(),
FormsHistogram = formSubmissionsHistogram.Select(x => new HistogramPoint
{
Bucket = x.Bucket,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ public class Response
public List<VisitedPollingStationLevelStats> Level3Stats { get; set; } = [];
public List<VisitedPollingStationLevelStats> Level4Stats { get; set; } = [];
public List<VisitedPollingStationLevelStats> Level5Stats { get; set; } = [];

public VisitedLocationLevelStats? TotalLocationStats { get; set; }
public List<VisitedLocationLevelStats> LocationLevel1Stats { get; set; } = [];
public List<VisitedLocationLevelStats> LocationLevel2Stats { get; set; } = [];
public List<VisitedLocationLevelStats> LocationLevel3Stats { get; set; } = [];
public List<VisitedLocationLevelStats> LocationLevel4Stats { get; set; } = [];
public List<VisitedLocationLevelStats> LocationLevel5Stats { get; set; } = [];

public HistogramPoint[] FormsHistogram { get; set; } = [];
public HistogramPoint[] QuestionsHistogram { get; set; } = [];
public HistogramPoint[] FlaggedAnswersHistogram { get; set; } = [];
Expand Down
151 changes: 151 additions & 0 deletions api/src/Feature.Statistics/GetMonitoringNgoStatistics/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,150 @@ AND PS."Level5" IS NOT NULL
INNER JOIN "PollingStationsPerLevel" PS ON S."Level" = PS."Level" AND S."Path" = PS."Path"
INNER JOIN "ActiveObserversPerLevel" AOL ON S."Level" = AOL."Level" AND S."Path" = AOL."Path";

WITH
"LocationStatsRaw" AS (
SELECT
CR."LocationId",
COUNT(1) AS "NumberOfCitizenReports",
SUM(CR."NumberOfFlaggedAnswers") AS "NumberOfFlaggedAnswers",
SUM(CR."NumberOfQuestionsAnswered") AS "NumberOfQuestionsAnswered"
FROM "CitizenReports" CR
INNER JOIN "ElectionRounds" ER ON ER."Id" = CR."ElectionRoundId"
WHERE CR."ElectionRoundId" = @electionRoundId
AND ER."MonitoringNgoForCitizenReportingId" = @monitoringNgoId
AND CR."NumberOfQuestionsAnswered" > 0
GROUP BY CR."LocationId"
),
"ElectionLocations" AS (
SELECT
L."Id",
NULLIF(L."Level1", '') AS "Level1",
NULLIF(L."Level2", '') AS "Level2",
NULLIF(L."Level3", '') AS "Level3",
NULLIF(L."Level4", '') AS "Level4",
NULLIF(L."Level5", '') AS "Level5"
FROM "Locations" L
WHERE L."ElectionRoundId" = @electionRoundId
AND L."Level1" != ''
),
"LocationsPerLevel" AS (
SELECT
CASE
WHEN GROUPING(L."Level1") = 1 THEN 0
WHEN GROUPING(L."Level2") = 1 THEN 1
WHEN GROUPING(L."Level3") = 1 THEN 2
WHEN GROUPING(L."Level4") = 1 THEN 3
WHEN GROUPING(L."Level5") = 1 THEN 4
ELSE 5
END AS "Level",
CASE
WHEN GROUPING(L."Level1") = 1 THEN '/'
ELSE CONCAT_WS(' / ', L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
END AS "Path",
COUNT(L."Id") AS "NumberOfLocations"
FROM "ElectionLocations" L
GROUP BY GROUPING SETS (
(),
(L."Level1"),
(L."Level1", L."Level2"),
(L."Level1", L."Level2", L."Level3"),
(L."Level1", L."Level2", L."Level3", L."Level4"),
(L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
)
HAVING
GROUPING(L."Level1") = 1
OR (
GROUPING(L."Level2") = 1
AND L."Level1" IS NOT NULL
)
OR (
GROUPING(L."Level3") = 1
AND GROUPING(L."Level2") = 0
AND L."Level2" IS NOT NULL
)
OR (
GROUPING(L."Level4") = 1
AND GROUPING(L."Level3") = 0
AND L."Level3" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 1
AND GROUPING(L."Level4") = 0
AND L."Level4" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 0
AND L."Level5" IS NOT NULL
)
),
"LocationLevelsStats" AS (
SELECT
CASE
WHEN GROUPING(L."Level1") = 1 THEN 0
WHEN GROUPING(L."Level2") = 1 THEN 1
WHEN GROUPING(L."Level3") = 1 THEN 2
WHEN GROUPING(L."Level4") = 1 THEN 3
WHEN GROUPING(L."Level5") = 1 THEN 4
ELSE 5
END AS "Level",
CASE
WHEN GROUPING(L."Level1") = 1 THEN '/'
ELSE CONCAT_WS(' / ', L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
END AS "Path",
COUNT(LS."LocationId") AS "NumberOfVisitedLocations",
COALESCE(SUM(LS."NumberOfCitizenReports"), 0) AS "NumberOfCitizenReports",
COALESCE(SUM(LS."NumberOfFlaggedAnswers"), 0) AS "NumberOfFlaggedAnswers",
COALESCE(SUM(LS."NumberOfQuestionsAnswered"), 0) AS "NumberOfQuestionsAnswered"
FROM "LocationStatsRaw" LS
INNER JOIN "ElectionLocations" L ON L."Id" = LS."LocationId"
GROUP BY GROUPING SETS (
(),
(L."Level1"),
(L."Level1", L."Level2"),
(L."Level1", L."Level2", L."Level3"),
(L."Level1", L."Level2", L."Level3", L."Level4"),
(L."Level1", L."Level2", L."Level3", L."Level4", L."Level5")
)
HAVING
GROUPING(L."Level1") = 1
OR (
GROUPING(L."Level2") = 1
AND L."Level1" IS NOT NULL
)
OR (
GROUPING(L."Level3") = 1
AND GROUPING(L."Level2") = 0
AND L."Level2" IS NOT NULL
)
OR (
GROUPING(L."Level4") = 1
AND GROUPING(L."Level3") = 0
AND L."Level3" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 1
AND GROUPING(L."Level4") = 0
AND L."Level4" IS NOT NULL
)
OR (
GROUPING(L."Level5") = 0
AND L."Level5" IS NOT NULL
)
)
SELECT
S."Path",
S."Level",
S."NumberOfVisitedLocations",
L."NumberOfLocations",
S."NumberOfCitizenReports",
S."NumberOfFlaggedAnswers",
S."NumberOfQuestionsAnswered",
(
S."NumberOfVisitedLocations" * 100.0 / NULLIF(L."NumberOfLocations", 0)
) AS "CoveragePercentage"
FROM "LocationLevelsStats" S
INNER JOIN "LocationsPerLevel" L ON S."Level" = L."Level" AND S."Path" = L."Path";

WITH "AvailableObservers" AS (
SELECT MO."Id" AS "MonitoringObserverId"
FROM "MonitoringObservers" MO
Expand Down Expand Up @@ -472,6 +616,7 @@ SELECT MO."Id" AS "MonitoringObserverId"

var observersStats = multi.ReadSingle<ObserversStats>();
var visitedPollingStationsStats = multi.Read<VisitedPollingStationLevelStats>().ToList();
var visitedLocationStats = multi.Read<VisitedLocationLevelStats>().ToList();
var formSubmissionsHistogram = multi.Read<FormSubmissionsHistogramPoint>().ToList();
var quickReportsHistogram = multi.Read<HistogramPoint>().ToList();
var citizenReportsHistogram = multi.Read<HistogramPoint>().ToList();
Expand All @@ -487,6 +632,12 @@ SELECT MO."Id" AS "MonitoringObserverId"
Level3Stats = visitedPollingStationsStats.Where(x => x.Level == 3).ToList(),
Level4Stats = visitedPollingStationsStats.Where(x => x.Level == 4).ToList(),
Level5Stats = visitedPollingStationsStats.Where(x => x.Level == 5).ToList(),
TotalLocationStats = visitedLocationStats.FirstOrDefault(x => x.Level == 0),
LocationLevel1Stats = visitedLocationStats.Where(x => x.Level == 1).ToList(),
LocationLevel2Stats = visitedLocationStats.Where(x => x.Level == 2).ToList(),
LocationLevel3Stats = visitedLocationStats.Where(x => x.Level == 3).ToList(),
LocationLevel4Stats = visitedLocationStats.Where(x => x.Level == 4).ToList(),
LocationLevel5Stats = visitedLocationStats.Where(x => x.Level == 5).ToList(),
FormsHistogram = formSubmissionsHistogram.Select(x => new HistogramPoint
{
Bucket = x.Bucket,
Expand Down
Loading
Loading