adding otimizações
All checks were successful
API and ETL Build / build_etl (push) Successful in 1m48s
API and ETL Build / build_api (push) Successful in 1m51s

This commit is contained in:
Jose Henrique 2025-06-18 19:17:05 -03:00
parent 87a98fefb1
commit f5dda37285
3 changed files with 75 additions and 6 deletions

View File

@ -27,7 +27,7 @@ namespace OpenCand.API.Repository
return (await connection.QueryAsync<MaioresEnriquecimento>(@" return (await connection.QueryAsync<MaioresEnriquecimento>(@"
WITH patrimonio_anual AS ( WITH patrimonio_anual AS (
SELECT idcandidato, ano, SUM(valor) AS valor_total_ano SELECT idcandidato, ano, SUM(valor) AS valor_total_ano
FROM bem_candidato FROM mv_bem_candidato
GROUP BY idcandidato, ano GROUP BY idcandidato, ano
), ),
extremos_declaracao AS ( extremos_declaracao AS (

View File

@ -106,9 +106,9 @@ namespace OpenCand.API.Services
{ {
return type.ToLower() switch return type.ToLower() switch
{ {
"bem" => "FROM bem_candidato src", "bem" => "FROM mv_bem_candidato src",
"despesa" => "FROM despesas_candidato src", "despesa" => "FROM mv_despesas_candidato src",
"receita" => "FROM receitas_candidato src", "receita" => "FROM mv_receitas_candidato src",
_ => throw new ArgumentException("Invalid type specified.") _ => throw new ArgumentException("Invalid type specified.")
}; };
} }
@ -117,8 +117,8 @@ namespace OpenCand.API.Services
{ {
return groupBy.ToLower() switch 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", "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", "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.") _ => throw new ArgumentException("Invalid group by specified.")
}; };
} }

69
db/mv.sql Normal file
View File

@ -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);