Corrige o uso de XMLWithPre.body_fragment_fingerprint e XMLWithPre.body_fingerprint - #1040
Closed
robertatakenaka wants to merge 3 commits into
Closed
Conversation
Propósito: Atualizar a versão fixada do packtools no requirements/base.txt. Solução técnica: Bump de packtools de 4.16.8 para 4.16.11 via egg git+https://github.com/scieloorg/packtools.git@4.16.11#egg=packtools, versão que corrige o bug de XMLWithPre.body_fragment_fingerprint (que retornava incorretamente o fingerprint do corpo INTEIRO em vez do fragmento), e cria XMLWithPre.body_fingerprint que retorna fingerprint do corpo INTEIRO, pré-requisito para a correção em query_params.py.
…l_body_query Propósito: Corrigir falso-positivo de match em QueryBuilderPidProviderXML.partial_body_query causado pelo bug do XMLWithPre.body_fragment_fingerprint, que retornava o fingerprint do corpo INTEIRO do artigo em vez do fragmento, permitindo colisão entre artigos diferentes com rótulos de seção genéricos (ex.: 'ARTIGO DE REVISÃO'). Solução técnica: Adiciona leitura de xml_with_pre.body_fingerprint (novo atributo, fingerprint do corpo INTEIRO) em self.z_body, mantendo self.z_body_fragment como fingerprint do FRAGMENTO (agora corrigido no packtools 4.16.11). partial_body_query passa a compor candidates com os três hashes disponíveis (z_partial_body legado, z_body_fragment, z_body), preservando fallback para z_partial_body__isnull=True quando nenhum estiver presente. Remove também variável morta other_pids em identifier_queries.
…t em partial_body_query Propósito: Validar a correção de partial_body_query após o fix do bug em XMLWithPre.body_fragment_fingerprint, garantindo que o fingerprint do corpo INTEIRO (body_fingerprint) e o do fragmento (body_fragment_fingerprint) sejam tratados como candidatos distintos e corretos, evitando regressão do falso-positivo original. Solução técnica: Adiciona parâmetro body_fingerprint em make_xml_adapter, setando explicitamente adapter.xml_with_pre.body_fingerprint (default None) para evitar Mock truthy espúrio nas asserções. Ajusta testes existentes para usar 'hash-fragmento-do-corpo' em vez de 'hash-corpo-inteiro' onde o valor representa body_fragment_fingerprint, e para comparar z_partial_body__in com set (não list), refletindo a implementação em produção. Adiciona novos testes cobrindo os três hashes combinados (test_combines_textual_fields_with_all_three_body_hashes) e a regressão direta do incidente (test_two_articles_with_same_legacy_hash_but_different_body_fingerprint_differ).
robertatakenaka
requested review from
Rossi-Luciano,
gitnnolabs and
pitangainnovare
August 3, 2026 21:06
Member
Author
|
este Pr não será necessário porque nenhuma release entrou em produção com o defeito que corrige |
robertatakenaka
removed request for
Rossi-Luciano,
gitnnolabs and
pitangainnovare
August 4, 2026 10:04
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que esse PR faz?
Corrige o falso-positivo de match em
QueryBuilderPidProviderXML.partial_body_querycausado por um bug emXMLWithPre.body_fragment_fingerprint, que retornava o fingerprint do corpo INTEIRO do artigo em vez do fingerprint de um fragmento. Isso permitia colisão entre artigos diferentes que compartilham rótulos de seção genéricos no início do corpo (ex.: "ARTIGO DE REVISÃO"), já que o hash legadoz_partial_bodyé calculado apenas a partir do primeiro parágrafo não vazio.A correção foi feita em duas frentes:
4.16.11):XMLWithPrepassa a expor dois atributos distintos —body_fingerprint(corpo INTEIRO) ebody_fragment_fingerprint(fragmento, agora corrigido).pid_provider/query_params.py:QueryBuilderPidProviderXMLpassa a ler ambos os atributos (self.z_bodyeself.z_body_fragment) e considerá-los como candidatos independentes empartial_body_query, junto com o hash legadoz_partial_body, sem exigir migração/backfill dos registros já existentes.Onde a revisão poderia começar?
pid_provider/query_params.py, métodopartial_body_query(e o construtor__init__da classeQueryBuilderPidProviderXML, ondeself.z_bodyeself.z_body_fragmentsão definidos).Como este poderia ser testado manualmente?
requirements/base.txt(4.16.11).python manage.py test pid_provider.tests.test_query_params.XMLWithPreos fingerprints, e verificar queQueryBuilderPidProviderXML(...).partial_body_queryproduz condiçõesz_partial_body__indistintas para cada um (não deve haver match cruzado ao consultarPidProviderXML.objects.filter(...)).Algum cenário de contexto que queira dar?
Esta correção resolve um incidente de produção em que artigos distintos, com seção inicial de rótulo genérico (comum em editoriais/artigos de revisão), estavam sendo indevidamente associados a um mesmo registro
PidProviderXMLdurante o processo de re-ingestão/atualização de XML, devido à imprecisão do hash de corpo parcial. A solução mantém retrocompatibilidade: registros antigos que gravaram no campoz_partial_bodytanto o formato legado quanto o formato (bugado) anterior debody_fragment_fingerprintcontinuam sendo encontrados, pois todos os hashes conhecidos entram como candidatos noIN.Screenshots
Não aplicável (mudança de lógica de backend, sem interface gráfica).
Quais são os tickets relevantes?
Relacionado à issue de correção do falso-positivo de match em
PidProviderXML(falso-positivo deQueryDocumentMultipleObjectsReturnedError).Fixes #1039
Referências
4.16.11: https://github.com/scieloorg/packtools (correção deXMLWithPre.body_fragment_fingerprint)NULL = NULLserUNKNOWNem SQL (motivação do fallbackz_partial_body__isnull=True)Segurança da informação (NSI.04)
Este PR manipula dados sensíveis ou pessoais (LGPD)?
Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?
Este PR introduz, atualiza ou remove dependências de terceiros?
4.16.8→4.16.11), dependência já utilizada no projeto; pendente validação formal via SBOM/Trivy no pipeline de CI.Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?
Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?
Qobjects), sem concatenação de strings SQL.Este PR expõe novos endpoints, telas ou serviços?
Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?