J’examine le processus de remploi des badges en cours ici :
En particulier, la requête suivante semble poser problème (voir Long-Running Sidekiq Jobs)
sql = <<~SQL
DELETE FROM user_badges
WHERE id IN (
SELECT ub.id
FROM user_badges ub
LEFT JOIN (
#{badge.query}
) q ON q.user_id = ub.user_id
#{post_clause}
WHERE ub.badge_id = :id AND q.user_id IS NULL
)
SQL
Cette requête effectue un LEFT JOIN, de sorte que tous les résultats de user_badges sont renvoyés, qu’il y ait une correspondance ou non. Cependant, cette partie semble très confuse :
ON q.user_id = ub.user_id
...
AND q.user_id IS NULL
La requête joint les lignes où user_id correspond, puis rejette ces lignes via la clause WHERE, rendant la jointure en quelque sorte inutile. Je me demande donc :
-
Quel est l’objectif de la fonction de remploi ? Elle semble effacer complètement le badge en cours de traitement, puis le reconstruire entièrement d’un coup. Est-ce nécessaire ?
-
Quelle est la différence entre un badge qui cible des publications et un qui ne le fait pas, dans le contexte de cette fonction ? Avec un LEFT JOIN, cela a-t-il même de l’importance pour identifier le bon badge_id à supprimer en vue de la reconstruction ?