Skip to content

Fix Releases page pagination

Nathan Friend requested to merge nfriend-fix-releases-graphql-pagination into master

What does this MR do?

Fixes the issue with the Releases page pagination as described in #331547 (closed).

Cursors before

Before this change, cursors looked like this: eyJpZCI6IjE2Njc2NjUifQ, which decoded to something like this:

{ id: "1667665" }

Cursors after

After this change, cursors will look like this: eyJyZWxlYXNlZF9hdCI6IjIwMjEtMDMtMDkgMTY6NTM6MzQuMTQyMzY1MDAwIFVUQyIsImlkIjoiMTUxIn0, which decode to something like this:

{ released_at: "2021-03-09 16:53:34.142365000 UTC", id: "151" }

These cursors are visible to the end user - they are used as a URL parameter, for example: https://example.gitlab.com/user/project/-/releases?before=eyJyZWxlYXNlZF9hdCI6IjIwMjEtMDMtMDkgMTU6MzU6MTcuMTQ5NTcwMDAwIFVUQyIsImlkIjoiMTUwIn0

Queries before

When initially navigating to the page

SELECT "releases".*
FROM   "releases"
WHERE  "releases"."project_id" = 19
       AND "releases"."tag" IS NOT NULL
ORDER  BY released_at DESC,
          "releases"."id" DESC
LIMIT  10  

When clicking the Next button

SELECT "releases".*
FROM   "releases"
WHERE  "releases"."project_id" = 19
       AND "releases"."tag" IS NOT NULL
       AND (( "releases"."id" < 151 ))
       AND "releases"."id" != 151
ORDER  BY released_at DESC,
          "releases"."id" DESC
LIMIT  10  

When clicking the Prev button

SELECT "releases".*
FROM   "releases"
WHERE  "releases"."project_id" = 19
       AND "releases"."tag" IS NOT NULL
       AND (( "releases"."id" > 125 ))
       AND "releases"."id" != 125
ORDER  BY released_at ASC,
          "releases"."id" ASC
LIMIT  11

Queries after

When initially navigating to the page

SELECT "releases".*
FROM   "releases"
WHERE  "releases"."project_id" = 19
       AND "releases"."tag" IS NOT NULL
ORDER  BY "releases"."released_at" DESC,
          "releases"."id" DESC
LIMIT  10  

When clicking the Next button

SELECT "releases".*
FROM   "releases"
WHERE  "releases"."project_id" = 19
       AND "releases"."tag" IS NOT NULL
       AND ( ( "releases"."id" < 151
               AND "releases"."released_at" = '2021-03-09 16:53:34.142365' )
              OR ( "releases"."released_at" < '2021-03-09 16:53:34.142365' ) )
ORDER  BY "releases"."released_at" DESC,
          "releases"."id" DESC
LIMIT  10   

When clicking the Prev button

SELECT "releases".*
FROM   "releases"
WHERE  "releases"."project_id" = 19
       AND "releases"."tag" IS NOT NULL
       AND ( ( "releases"."id" > 150
               AND "releases"."released_at" = '2021-03-09 15:35:17.149570' )
              OR ( "releases"."released_at" > '2021-03-09 15:35:17.149570' ) )
ORDER  BY "releases"."released_at" ASC,
          "releases"."id" ASC
LIMIT  11  

Related to #331547 (closed)

Edited by Nathan Friend

Merge request reports