Skip to content

Elimina consultas repetidas ao carregar metadados de documentos relac… - #129

Merged
pitangainnovare merged 1 commit into
scieloorg:mainfrom
pitangainnovare:perf/document-metadata-n-plus-one
Aug 29, 2026
Merged

Elimina consultas repetidas ao carregar metadados de documentos relac…#129
pitangainnovare merged 1 commit into
scieloorg:mainfrom
pitangainnovare:perf/document-metadata-n-plus-one

Conversation

@pitangainnovare

Copy link
Copy Markdown
Contributor

O que esse PR faz?

Elimina consultas repetidas ao PostgreSQL durante a geração dos metadados de documentos relacionados.

O método Document.metadata() acessava parent_document, mas não carregava essa relação por meio de select_related. Consequentemente, cada capítulo podia gerar uma consulta adicional ao banco.

Este PR:

  • inclui parent_document no select_related;
  • preserva o formato dos dicionários de metadados;
  • adiciona testes para Book–Chapter, Journal–Article e documentos sem pai ou fonte;
  • adiciona um teste que exige uma única consulta para materializar os metadados;
  • atualiza a versão da aplicação de 2.1.0 para 2.1.1.

Não há alteração nos cálculos COUNTER, payloads, filas Celery, mappings ou documentos enviados ao OpenSearch.

Onde a revisão poderia começar?

A revisão pode começar em:

document/models.py, no método Document.metadata().

Em seguida, verificar os testes adicionados em:

document/tests/test_models.py, na classe DocumentMetadataTests.

Como este poderia ser testado manualmente?

Executar os testes no Docker:

docker compose -f local.yml run --rm django \
  pytest document/tests/test_models.py -q

Executar todos os testes do módulo de documentos:

docker compose -f local.yml run --rm django \
  pytest document/tests -q

Executar as integrações de métricas afetadas pelo carregamento dos metadados:

docker compose -f local.yml run --rm django \
  pytest \
    metrics/tests/integration/test_books_log_to_metrics.py \
    metrics/tests/integration/test_classic_log_to_metrics.py \
    -q

Resultados obtidos durante o desenvolvimento:

  • testes focados: 5 aprovados;
  • módulo document: 11 aprovados;
  • integrações Books e Classic: 12 aprovados e 2 ignorados;
  • nenhuma migration foi gerada;
  • git diff --check e Flake8 concluídos sem erros.

Também foi processado localmente o log real de Books de 1º de agosto de 2026, cobrindo validação, parsing, geração do payload e exportação temporária para o OpenSearch:

  • 19.634 linhas processadas;
  • 16.352 linhas válidas;
  • 3.282 linhas descartadas;
  • 8.849 documentos mensais;
  • 16.403 documentos anuais;
  • 30 consultas ao PostgreSQL durante processamento e exportação;
  • aproximadamente 29 segundos para processamento e exportação.

Os registros PostgreSQL e índices OpenSearch temporários utilizados nesse ensaio foram removidos após a validação.

Algum cenário de contexto que queira dar?

Na coleção Books existem aproximadamente 38 mil documentos, dos quais cerca de 35 mil são capítulos associados a um livro por meio de parent_document.

Antes da alteração, uma amostra de 100 documentos com pai executava 101 consultas SQL. Após incluir a relação no select_related, a mesma operação passou a executar uma consulta.

A alteração também é compatível com coleções baseadas na relação Journal–Article. Artigos normalmente não possuem parent_document, e a relação com o periódico continua sendo carregada por source.

Screenshots

N/A

Quais são os tickets relevantes?

Parte do ticket #128.

Referências

  • Método Document.metadata() em document/models.py;
  • testes de metadados em document/tests/test_models.py;
  • documentação do Django sobre QuerySet.select_related().

Segurança da informação (NSI.04)

Seção obrigatória. Marque as opções aplicáveis e justifique quando necessário. Referência: NSI.04 - Norma de Desenvolvimento Seguro.

Este PR manipula dados sensíveis ou pessoais (LGPD)?

  • Sim — descreva os controles de proteção aplicados:
  • Não

Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?

  • Sim — descreva o que mudou e por quê:
  • Não

Este PR introduz, atualiza ou remove dependências de terceiros?

  • Sim — as novas dependências foram verificadas no SBOM/Trivy sem vulnerabilidades críticas/altas em aberto?
    • Verificado e aprovado
    • Pendente / vulnerabilidade aceita com justificativa:
  • Não

Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?

  • Sim — link do job:
  • Não aplicável a este PR — não há alteração de dependências, imagens ou superfície de acesso. O Gitleaks local não encontrou segredos.

Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?

  • Sim — confirme que há sanitização/parametrização:
  • Não

Este PR expõe novos endpoints, telas ou serviços?

  • Sim — HTTPS obrigatório está garantido e o acesso segue o princípio de menor privilégio?
  • Não

Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?

  • Não, nenhum segredo foi commitado
  • Sim (bloquear merge e corrigir antes de prosseguir)

@pitangainnovare
pitangainnovare merged commit 0642a64 into scieloorg:main Aug 29, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant