Code de remplissage de badge

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 :

  1. 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 ?

  2. 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 ?

3 « J'aime »