diff --git a/OpenCand.API/Repository/EstatisticaRepository.cs b/OpenCand.API/Repository/EstatisticaRepository.cs index 1a45911..f9d303e 100644 --- a/OpenCand.API/Repository/EstatisticaRepository.cs +++ b/OpenCand.API/Repository/EstatisticaRepository.cs @@ -27,7 +27,7 @@ namespace OpenCand.API.Repository return (await connection.QueryAsync(@" WITH patrimonio_anual AS ( SELECT idcandidato, ano, SUM(valor) AS valor_total_ano - FROM bem_candidato + FROM mv_bem_candidato GROUP BY idcandidato, ano ), extremos_declaracao AS ( diff --git a/OpenCand.API/Services/EstatisticaService.cs b/OpenCand.API/Services/EstatisticaService.cs index 8a4d1df..a12055d 100644 --- a/OpenCand.API/Services/EstatisticaService.cs +++ b/OpenCand.API/Services/EstatisticaService.cs @@ -106,9 +106,9 @@ namespace OpenCand.API.Services { return type.ToLower() switch { - "bem" => "FROM bem_candidato src", - "despesa" => "FROM despesas_candidato src", - "receita" => "FROM receitas_candidato src", + "bem" => "FROM mv_bem_candidato src", + "despesa" => "FROM mv_despesas_candidato src", + "receita" => "FROM mv_receitas_candidato src", _ => throw new ArgumentException("Invalid type specified.") }; } @@ -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", - "partido" or "uf" or "cargo" => "JOIN candidato_mapping cm ON src.idcandidato = cm.idcandidato AND src.ano = cm.ano", + "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'", _ => throw new ArgumentException("Invalid group by specified.") }; } diff --git a/db/mv.sql b/db/mv.sql new file mode 100644 index 0000000..0a6c512 --- /dev/null +++ b/db/mv.sql @@ -0,0 +1,69 @@ +-- This script creates materialized views for bem_candidato, despesas_candidato, and receitas_candidato +-- Drop existing materialized views if they exist +DROP MATERIALIZED VIEW IF EXISTS mv_bem_candidato; +DROP MATERIALIZED VIEW IF EXISTS mv_despesas_candidato; +DROP MATERIALIZED VIEW IF EXISTS mv_receitas_candidato; + +-- Creation stage +--- +--- MV for bem_candidato +CREATE MATERIALIZED VIEW mv_bem_candidato AS +SELECT + bem_candidato.ano, + bem_candidato.idcandidato, + candidato_mapping.siglauf as siglauf, + candidato_mapping.sgpartido, + cargo, + SUM(valor) AS valor +FROM + bem_candidato +JOIN candidato_mapping ON bem_candidato.idcandidato = candidato_mapping.idcandidato AND bem_candidato.ano = candidato_mapping.ano AND candidato_mapping.turno = '1' +GROUP BY + bem_candidato.ano, + bem_candidato.idcandidato, + candidato_mapping.sgpartido, + siglauf, + cargo; +CREATE INDEX idx_mv_bem_candidato ON mv_bem_candidato (ano, idcandidato, siglauf, sgpartido, cargo); + +--- +--- MV for despesas_candidato +CREATE MATERIALIZED VIEW mv_despesas_candidato AS +SELECT + despesas_candidato.ano, + despesas_candidato.idcandidato, + candidato_mapping.siglauf as siglauf, + despesas_candidato.sgpartido, + cargo, + SUM(valor) AS valor +FROM + despesas_candidato +JOIN candidato_mapping ON despesas_candidato.idcandidato = candidato_mapping.idcandidato AND despesas_candidato.ano = candidato_mapping.ano AND candidato_mapping.turno = '1' +GROUP BY + despesas_candidato.ano, + despesas_candidato.idcandidato, + despesas_candidato.sgpartido, + siglauf, + cargo; +CREATE INDEX idx_mv_despesas_candidato ON mv_despesas_candidato (ano, idcandidato, siglauf, sgpartido, cargo); + +--- +--- MV for receitas_candidato +CREATE MATERIALIZED VIEW mv_receitas_candidato AS +SELECT + receitas_candidato.ano, + receitas_candidato.idcandidato, + candidato_mapping.siglauf as siglauf, + receitas_candidato.sgpartido, + cargo, + SUM(valor) AS valor +FROM + receitas_candidato +JOIN candidato_mapping ON receitas_candidato.idcandidato = candidato_mapping.idcandidato AND receitas_candidato.ano = candidato_mapping.ano AND candidato_mapping.turno = '1' +GROUP BY + receitas_candidato.ano, + receitas_candidato.idcandidato, + receitas_candidato.sgpartido, + siglauf, + cargo; +CREATE INDEX idx_mv_receitas_candidato ON mv_receitas_candidato (ano, idcandidato, siglauf, sgpartido, cargo);