Interface ConjuntoLoteRepository

All Superinterfaces:
io.micronaut.data.repository.CrudRepository<ConjuntoLote, String>, io.micronaut.data.repository.GenericRepository<ConjuntoLote, String>

@JdbcRepository(dialect=POSTGRES) public interface ConjuntoLoteRepository extends io.micronaut.data.repository.CrudRepository<ConjuntoLote, String>
Persistência de ConjuntoLote (lote por zip). O fechamento do lote é atômico: tentarNotificar(String, int) recebe a contagem de finalizados como parâmetro (vinda da SPI ContadorProcessamentosFinalizados) — assim o UPDATE não referencia a tabela de domínio do app, mas o WHERE notificado_em IS NULL preserva a garantia de thread-vencedor único.
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    Conta um arquivo já existente (HTTP 200).
    int
    Conta uma entrada do zip que não gerou processamento nem era duplicata-sucesso.
    int
    registrar(String conjuntoId, int total)
    Cria o lote se ainda não existir (idempotente).
    int
    tentarNotificar(String conjuntoId, int finalizados)
    UPDATE atômico: retorna 1 só para o thread que completa o lote (duplicados + nao_processados + finalizados >= total), 0 para os demais.

    Methods inherited from interface io.micronaut.data.repository.CrudRepository

    count, delete, deleteAll, deleteAll, deleteById, existsById, findAll, findById, insert, insertAll, save, saveAll, update, updateAll
  • Method Details

    • registrar

      @Query(value="INSERT INTO xls_conjunto_lote (conjunto_id, total, criado_em)\nVALUES (:conjuntoId, :total, NOW())\nON CONFLICT (conjunto_id) DO NOTHING\n", readOnly=false) int registrar(String conjuntoId, int total)
      Cria o lote se ainda não existir (idempotente).
    • incrementarDuplicados

      @Query(value="UPDATE xls_conjunto_lote SET duplicados = duplicados + 1\nWHERE conjunto_id = :conjuntoId\n", readOnly=false) int incrementarDuplicados(String conjuntoId)
      Conta um arquivo já existente (HTTP 200).
    • incrementarNaoProcessados

      @Query(value="UPDATE xls_conjunto_lote SET nao_processados = nao_processados + 1\nWHERE conjunto_id = :conjuntoId\n", readOnly=false) int incrementarNaoProcessados(String conjuntoId)
      Conta uma entrada do zip que não gerou processamento nem era duplicata-sucesso.
    • tentarNotificar

      @Query(value="UPDATE xls_conjunto_lote SET notificado_em = NOW()\nWHERE conjunto_id = :conjuntoId\n AND notificado_em IS NULL\n AND (duplicados + nao_processados + :finalizados) >= total\n", readOnly=false) int tentarNotificar(String conjuntoId, int finalizados)
      UPDATE atômico: retorna 1 só para o thread que completa o lote (duplicados + nao_processados + finalizados >= total), 0 para os demais. A contagem de finalizados vem da SPI (não de um subquery na tabela de domínio).