add apelido

This commit is contained in:
Jose Henrique 2025-06-02 16:47:24 -03:00
parent a3d67198af
commit 03b1f4f1d1
8 changed files with 66 additions and 11 deletions

View File

@ -15,11 +15,21 @@ namespace OpenCand.Repository
using (var connection = new NpgsqlConnection(ConnectionString)) using (var connection = new NpgsqlConnection(ConnectionString))
{ {
return (await connection.QueryAsync<Candidato>(@" return (await connection.QueryAsync<Candidato>(@"
SELECT idcandidato, cpf, nome, datanascimento, email, sexo, estadocivil, escolaridade, ocupacao SELECT *
CASE
WHEN lower(nome) = lower(@query) THEN 0 -- Exact match (case-insensitive)
WHEN lower(nome) LIKE lower(@query) || '%' THEN 1 -- Starts with match (case-insensitive)
WHEN lower(nome) LIKE '%' || lower(@query) THEN 2 -- Contains anywhere match (case-insensitive)
WHEN cpf = @query THEN 0 -- Exact match for CPF
WHEN cpf LIKE @query || '%' THEN 1 -- Starts with match for CPF
WHEN cpf LIKE '%' || @query THEN 2 -- Contains anywhere match for CPF
ELSE 3
END AS name_rank
FROM candidato FROM candidato
WHERE nome ILIKE '%' || @query || '%' OR WHERE nome ILIKE '%' || @query || '%' OR
cpf ILIKE '%' || @query || '%' OR cpf ILIKE '%' || @query || '%'
email ILIKE '%' || @query || '%' ORDER BY name_rank,
length(nome) ASC
LIMIT 10;", LIMIT 10;",
new { query })).AsList(); new { query })).AsList();
} }

View File

@ -0,0 +1,33 @@
#!/bin/bash
cd ./fotos_cand
COUNT=0
shopt -s nocaseglob
# Loop through all folders
for dir in */; do
# Change into the directory
cd "$dir" || continue
# Loop over every “.jpeg” (or “.JPEG”):
for f in *.jpeg; do
# “${f%.[jJ][pP][eE][gG]}” strips off the .jpeg/.JPEG suffix
base="${f%.[jJ][pP][eE][gG]}"
newfile="${base}.jpg"
# If theres already a .jpg with the same “base,” decide what to do:
if [ -e "$newfile" ]; then
echo "Skipping $f$newfile (target exists)"
# you could `rm "$f"` or move it to a backup folder here if you prefer
else
mv -v "$f" "$newfile"
fi
done
# Change back to the parent directory
cd ..
done
shopt -u nocaseglob
# Print a message indicating completion
echo "Normalization complete. Processed $COUNT files."

View File

@ -12,6 +12,8 @@ namespace OpenCand.Core.Models
public string Nome { get; set; } public string Nome { get; set; }
public string Apelido { get; set; }
public DateTime? DataNascimento { get; set; } public DateTime? DataNascimento { get; set; }
public string Email { get; set; } public string Email { get; set; }
@ -35,6 +37,7 @@ namespace OpenCand.Core.Models
public Guid IdCandidato { get; set; } public Guid IdCandidato { get; set; }
public string Cpf { get; set; } public string Cpf { get; set; }
public string Nome { get; set; } public string Nome { get; set; }
public string Apelido { get; set; }
public string SqCandidato { get; set; } public string SqCandidato { get; set; }
public int Ano { get; set; } public int Ano { get; set; }
public string TipoEleicao { get; set; } public string TipoEleicao { get; set; }

View File

@ -29,6 +29,9 @@ namespace OpenCand.Parser.Models
[Name("NM_CANDIDATO")] [Name("NM_CANDIDATO")]
public string NomeCandidato { get; set; } public string NomeCandidato { get; set; }
[Name("NM_URNA_CANDIDATO")]
public string Apelido { get; set; }
[Name("NR_CPF_CANDIDATO")] [Name("NR_CPF_CANDIDATO")]
public string CPFCandidato { get; set; } public string CPFCandidato { get; set; }

View File

@ -92,6 +92,7 @@ namespace OpenCand.Parser.Services
Cpf = record.CPFCandidato, Cpf = record.CPFCandidato,
SqCandidato = record.SequencialCandidato, SqCandidato = record.SequencialCandidato,
Nome = record.NomeCandidato, Nome = record.NomeCandidato,
Apelido = record.Apelido,
Email = record.Email.Contains("@") ? record.Email : null, Email = record.Email.Contains("@") ? record.Email : null,
Sexo = record.Genero, Sexo = record.Genero,
EstadoCivil = record.EstadoCivil, EstadoCivil = record.EstadoCivil,
@ -103,6 +104,7 @@ namespace OpenCand.Parser.Services
{ {
Cpf = record.CPFCandidato, Cpf = record.CPFCandidato,
Nome = record.NomeCandidato, Nome = record.NomeCandidato,
Apelido = record.Apelido,
SqCandidato = record.SequencialCandidato, SqCandidato = record.SequencialCandidato,
Ano = record.AnoEleicao, Ano = record.AnoEleicao,
TipoEleicao = record.TipoAbrangencia, TipoEleicao = record.TipoAbrangencia,

View File

@ -24,9 +24,6 @@ namespace OpenCand
try try
{ {
logger.LogInformation("Initializing database");
// make a test connection to the database
logger.LogInformation("Starting data parsing"); logger.LogInformation("Starting data parsing");
var parserManager = services.GetRequiredService<ParserManager>(); var parserManager = services.GetRequiredService<ParserManager>();
await parserManager.ParseFullDataAsync(); await parserManager.ParseFullDataAsync();

View File

@ -16,8 +16,8 @@ namespace OpenCand.Repository
using (var connection = new NpgsqlConnection(ConnectionString)) using (var connection = new NpgsqlConnection(ConnectionString))
{ {
await connection.ExecuteAsync(@" await connection.ExecuteAsync(@"
INSERT INTO candidato (idcandidato, cpf, nome, datanascimento, email, sexo, estadocivil, escolaridade, ocupacao) INSERT INTO candidato (idcandidato, cpf, nome, apelido, datanascimento, email, sexo, estadocivil, escolaridade, ocupacao)
VALUES (@idcandidato, @cpf, @nome, @datanascimento, @email, @sexo, @estadocivil, @escolaridade, @ocupacao) VALUES (@idcandidato, @cpf, @nome, @apelido, @datanascimento, @email, @sexo, @estadocivil, @escolaridade, @ocupacao)
ON CONFLICT (idcandidato) DO UPDATE SET ON CONFLICT (idcandidato) DO UPDATE SET
cpf = EXCLUDED.cpf, cpf = EXCLUDED.cpf,
nome = EXCLUDED.nome, nome = EXCLUDED.nome,
@ -26,12 +26,14 @@ namespace OpenCand.Repository
sexo = EXCLUDED.sexo, sexo = EXCLUDED.sexo,
estadocivil = EXCLUDED.estadocivil, estadocivil = EXCLUDED.estadocivil,
escolaridade = EXCLUDED.escolaridade, escolaridade = EXCLUDED.escolaridade,
ocupacao = EXCLUDED.ocupacao;", ocupacao = EXCLUDED.ocupacao,
apelido = EXCLUDED.apelido;",
new new
{ {
idcandidato = candidato.IdCandidato, idcandidato = candidato.IdCandidato,
cpf = candidato.Cpf, cpf = candidato.Cpf,
nome = candidato.Nome, nome = candidato.Nome,
apelido = candidato.Apelido,
datanascimento = candidato.DataNascimento, datanascimento = candidato.DataNascimento,
email = candidato.Email, email = candidato.Email,
sexo = candidato.Sexo, sexo = candidato.Sexo,
@ -47,13 +49,14 @@ namespace OpenCand.Repository
using (var connection = new NpgsqlConnection(ConnectionString)) using (var connection = new NpgsqlConnection(ConnectionString))
{ {
await connection.ExecuteAsync(@" await connection.ExecuteAsync(@"
INSERT INTO candidato_mapping (idcandidato, cpf, nome, sqcandidato, ano, tipoeleicao, siglauf, nomeue, cargo, nrcandidato, sgpartido, resultado) INSERT INTO candidato_mapping (idcandidato, cpf, nome, apelido, sqcandidato, ano, tipoeleicao, siglauf, nomeue, cargo, nrcandidato, sgpartido, resultado)
VALUES (@idcandidato, @cpf, @nome, @sqcandidato, @ano, @tipoeleicao, @siglauf, @nomeue, @cargo, @nrcandidato, @sgpartido, @resultado);", VALUES (@idcandidato, @cpf, @nome, @apelido, @sqcandidato, @ano, @tipoeleicao, @siglauf, @nomeue, @cargo, @nrcandidato, @sgpartido, @resultado);",
new new
{ {
idcandidato = candidatoMapping.IdCandidato, idcandidato = candidatoMapping.IdCandidato,
cpf = candidatoMapping.Cpf, cpf = candidatoMapping.Cpf,
nome = candidatoMapping.Nome, nome = candidatoMapping.Nome,
apelido = candidatoMapping.Apelido,
sqcandidato = candidatoMapping.SqCandidato, sqcandidato = candidatoMapping.SqCandidato,
ano = candidatoMapping.Ano, ano = candidatoMapping.Ano,
tipoeleicao = candidatoMapping.TipoEleicao, tipoeleicao = candidatoMapping.TipoEleicao,

View File

@ -8,6 +8,7 @@ CREATE TABLE candidato (
idcandidato UUID NOT NULL PRIMARY KEY, idcandidato UUID NOT NULL PRIMARY KEY,
cpf VARCHAR(11), cpf VARCHAR(11),
nome VARCHAR(255) NOT NULL, nome VARCHAR(255) NOT NULL,
apelido VARCHAR(255),
datanascimento TIMESTAMPTZ, datanascimento TIMESTAMPTZ,
email TEXT, email TEXT,
sexo CHAR(15), sexo CHAR(15),
@ -16,12 +17,14 @@ CREATE TABLE candidato (
ocupacao VARCHAR(150) ocupacao VARCHAR(150)
); );
CREATE INDEX idx_candidato_nome ON candidato (nome); CREATE INDEX idx_candidato_nome ON candidato (nome);
CREATE INDEX idx_candidato_apelido ON candidato (apelido);
-- Each candidato (idcandidato, cpf, nome) will be mapped to a (sqcandidato, ano, tipo_eleicao, sg_uf, cargo, resultado) -- Each candidato (idcandidato, cpf, nome) will be mapped to a (sqcandidato, ano, tipo_eleicao, sg_uf, cargo, resultado)
CREATE TABLE candidato_mapping ( CREATE TABLE candidato_mapping (
idcandidato UUID NOT NULL, idcandidato UUID NOT NULL,
cpf VARCHAR(11), cpf VARCHAR(11),
nome VARCHAR(255) NOT NULL, nome VARCHAR(255) NOT NULL,
apelido VARCHAR(255),
sqcandidato TEXT, sqcandidato TEXT,
ano INT NOT NULL, ano INT NOT NULL,
tipoeleicao VARCHAR(50), tipoeleicao VARCHAR(50),
@ -36,6 +39,7 @@ CREATE TABLE candidato_mapping (
); );
CREATE INDEX idx_candidato_mapping_cpf ON candidato_mapping (cpf); CREATE INDEX idx_candidato_mapping_cpf ON candidato_mapping (cpf);
CREATE INDEX idx_candidato_mapping_nome ON candidato_mapping (nome); CREATE INDEX idx_candidato_mapping_nome ON candidato_mapping (nome);
CREATE INDEX idx_candidato_mapping_apelido ON candidato_mapping (apelido);
CREATE INDEX idx_candidato_mapping_ano ON candidato_mapping (ano); CREATE INDEX idx_candidato_mapping_ano ON candidato_mapping (ano);
CREATE INDEX idx_candidato_mapping_sqcandidato ON candidato_mapping (sqcandidato); CREATE INDEX idx_candidato_mapping_sqcandidato ON candidato_mapping (sqcandidato);