Quando si chiama l’endpoint /polls/voters.json, utilizzando la paginazione, abbiamo scoperto che la prima chiamata restituisce 25 utenti come previsto, ma la seconda pagina restituisce 26 utenti, uno dei quali è stato restituito nella prima chiamata. Questo è coerente ogni volta che ci sono più di 25 utenti.
Il problema è qui nel plugin poll per discourse:
https://github.com/discourse/poll/blob/main/plugins/poll/lib/poll.rb#L223
L’offset viene calcolato presumendo che postgres SQL sia esclusivo con un limite del rigo utilizzando BETWEEN, quando invece è inclusivo.
La prima query restituisce effettivamente 25, perché i righi calcolati iniziano effettivamente da 1, non da 0.
La mia correzione proposta è semplice come:
params = {
offset: offset + 1,
offset_plus_limit: offset + limit,
option_digest: opts[:option_id].presence,
}
Oppure, una soluzione più elegante potrebbe essere quella di utilizzare LIMIT e OFFSET di postgres
params = {
limit: limit,
offset: offset,
option_digest: opts[:option_id].presence,
}
WHERE pv.poll_id IN (:poll_ids)
/* where */
) v
ORDER BY digest, CASE WHEN rank = 'Abstain' THEN 1 ELSE CAST(rank AS integer) END, username
LIMIT :limit OFFSET :offset
SQL