Add ability to sort and paginate repository tags by name in descending order
Context
This is required to support &10208 (closed) and is related to the new List Repository Tags API endpoint.
Problem
We lack support for sorting and paginating tags by name
in descending order. Right now tags are sorted in ascending order. The GitLab UI currently supports sorting tags by name in descending order. To avoid a breaking change, we must add this ability to the new List Repository Tags API, otherwise, it can't be adopted by the GitLab UI, which is currently using the OCI tags list API with emulated pagination on the Rails backend side.
Solution
At the time of writing the repository_tags_detail_paginated
query looks as follows:
SELECT
t.name,
encode(m.digest, 'hex') AS digest,
encode(m.configuration_blob_digest, 'hex') AS config_digest,
mt.media_type,
m.total_size,
t.created_at,
t.updated_at
FROM
tags AS t
JOIN manifests AS m ON m.top_level_namespace_id = t.top_level_namespace_id
AND m.repository_id = t.repository_id
AND m.id = t.manifest_id
JOIN media_types AS mt ON mt.id = m.media_type_id
WHERE
t.top_level_namespace_id = $1
AND t.repository_id = $2
AND t.name > $3
ORDER BY
t.name
LIMIT $4
Tags are sorted in ascending order by name
, and there is no other option. To support descending order we need to expose a new sort
(asc
- default; desc
- optional) query parameter on the List Repository Tags API.
If sort=desc
, then we need to modify the query so that it ends with ORDER BY t.name DESC LIMIT $4
. Also, to not mess up with pagination, if sort=desc
, we must filter based on t.name < $3
instead of t.name > $3
. Additionally, if there is no last
query param (1st page), we need to either remove the AND t.name < $3
filter or set it to AND t.name <= 'z'
, so that no tags are ignored.
Example
[local] postgres@registry=# SELECT name FROM tags WHERE top_level_namespace_id = 1 AND repository_id = 1 ORDER BY name DESC;
name
------
z
x
w
v
u
t
s
r
q
p
o
n
m
l
j
i
h
g
f
e
d
c
b
a
(24 rows)
-- 1st page
[local] postgres@registry=# SELECT name FROM tags WHERE top_level_namespace_id = 1 AND repository_id = 1 ORDER BY name DESC LIMIT 3;
name
------
z
x
w
(3 rows)
-- 2nd page
[local] postgres@registry=# SELECT name FROM tags WHERE top_level_namespace_id = 1 AND repository_id = 1 AND name < 'w' ORDER BY name DESC LIMIT 3;
name
------
v
u
t
(3 rows)
-- 3rd page
[local] postgres@registry=# SELECT name FROM tags WHERE top_level_namespace_id = 1 AND repository_id = 1 AND name < 't' ORDER BY name DESC LIMIT 3;
name
------
s
r
q
(3 rows)
Tips
We'll need to implement sorting by other attributes beyond name
in the near future (e.g. #771 (closed)), so any new utility functions used to form the query string may have this into account.
This page may contain information related to upcoming products, features and functionality. It is important to note that the information presented is for informational purposes only, so please do not rely on the information for purchasing or planning purposes. Just like with all projects, the items mentioned on the page are subject to change or delay, and the development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.