Codice di riempimento badge

Sto esaminando il processo di riempimento dei badge in corso qui:

In particolare, la seguente query sembra presentare alcuni problemi (vedi 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

Questa query esegue un LEFT JOIN, quindi tutti i risultati da user_badges verranno restituiti indipendentemente dalla presenza di una corrispondenza, ma questa parte sembra molto confusa:

ON q.user_id = ub.user_id
...
AND q.user_id IS NULL

La query unisce le righe in cui l’user_id corrisponde, ma poi le scarta tramite la clausola WHERE, rendendo di fatto inutile quel join. Quindi mi chiedo:

  1. Qual è lo scopo della funzione di riempimento? Sembra che cancelli completamente il badge in elaborazione e lo ricostruisca tutto in una volta sola. È necessario?

  2. Qual è la differenza tra un badge che ha come target i post e uno che non lo è, per quanto riguarda questa funzione? Con un LEFT JOIN, ha davvero importanza quando si cerca l’identificativo badge_id corretto da cancellare per la ricostruzione?

3 Mi Piace