diff --git a/OpenCand.API/Services/EstatisticaService.cs b/OpenCand.API/Services/EstatisticaService.cs index a12055d..98b00db 100644 --- a/OpenCand.API/Services/EstatisticaService.cs +++ b/OpenCand.API/Services/EstatisticaService.cs @@ -94,7 +94,7 @@ namespace OpenCand.API.Services { return groupBy.ToLower() switch { - "candidato" => "SELECT src.idcandidato, c.nome, src.ano, SUM(src.valor) as valor", + "candidato" => "SELECT src.idcandidato, cm.nome, src.ano, SUM(src.valor) as valor", "partido" => "SELECT cm.sgpartido, src.ano, SUM(src.valor) as valor", "uf" => "SELECT cm.siglauf, src.ano, SUM(src.valor) as valor", "cargo" => "SELECT cm.cargo, src.ano, SUM(src.valor) as valor", @@ -117,8 +117,8 @@ namespace OpenCand.API.Services { return groupBy.ToLower() switch { - "candidato" => "JOIN candidato c ON src.idcandidato = c.idcandidato JOIN candidato_mapping cm ON src.idcandidato = cm.idcandidato AND src.ano = cm.ano AND cm.turno = '1'", - "partido" or "uf" or "cargo" => "JOIN candidato_mapping cm ON src.idcandidato = cm.idcandidato AND src.ano = cm.ano AND cm.turno = '1'", + "candidato" => "JOIN mv_candidato_mapping_analytics cm ON src.idcandidato = cm.idcandidato AND src.ano = cm.ano", + "partido" or "uf" or "cargo" => "JOIN mv_candidato_mapping_analytics cm ON src.idcandidato = cm.idcandidato AND src.ano = cm.ano", _ => throw new ArgumentException("Invalid group by specified.") }; } @@ -147,7 +147,7 @@ namespace OpenCand.API.Services if (filter.Ano.HasValue) { var paramName = $"ano{++_paramCounter}"; - conditions.Add($"src.ano = @{paramName}"); + conditions.Add($"cm.ano = @{paramName}"); _parameters[paramName] = filter.Ano.Value; } @@ -165,7 +165,7 @@ namespace OpenCand.API.Services { return groupBy.ToLower() switch { - "candidato" => "GROUP BY src.idcandidato, c.nome, src.ano", + "candidato" => "GROUP BY src.idcandidato, cm.nome, src.ano", "partido" => "GROUP BY cm.sgpartido, src.ano", "uf" => "GROUP BY cm.siglauf, src.ano", "cargo" => "GROUP BY cm.cargo, src.ano", diff --git a/db/mv.sql b/db/mv.sql index 0a6c512..fb48c75 100644 --- a/db/mv.sql +++ b/db/mv.sql @@ -67,3 +67,26 @@ GROUP BY siglauf, cargo; CREATE INDEX idx_mv_receitas_candidato ON mv_receitas_candidato (ano, idcandidato, siglauf, sgpartido, cargo); + +--- +--- View for candidate mapping summary +CREATE MATERIALIZED VIEW mv_candidato_mapping_analytics AS +SELECT DISTINCT cm.idcandidato, c.nome, cm.ano, cm.turno, cm.sgpartido, cm.siglauf, cm.cargo +FROM candidato_mapping cm +JOIN candidato c ON cm.idcandidato = c.idcandidato +WHERE cm.turno = '1'; + +CREATE INDEX idx_mv_candidato_mapping_analytics ON mv_candidato_mapping_analytics (idcandidato, ano); + + +-- Refresh the materialized views to ensure they are up-to-date +REFRESH MATERIALIZED VIEW mv_bem_candidato; +REFRESH MATERIALIZED VIEW mv_despesas_candidato; +REFRESH MATERIALIZED VIEW mv_receitas_candidato; +REFRESH MATERIALIZED VIEW mv_candidato_mapping_analytics; + +-- Force re-analyze the materialized views to update statistics +ANALYZE mv_bem_candidato; +ANALYZE mv_despesas_candidato; +ANALYZE mv_receitas_candidato; +ANALYZE mv_candidato_mapping_analytics; \ No newline at end of file