Add GraphQL support to sorting by storage_size
What does this MR do and why?
For Migrate admin area groups list to Vue shared co... (&17783 - closed) and Fix sorting by `storage_size` in GraphQL groups... (#552153 - closed)
We are working on moving Admin area -> Groups to Vue components with a GraphQL data source. When I was working on this I noticed that the GraphQL query did not support sorting by storage_size due to https://docs.gitlab.com/development/database/keyset_pagination/#complex-order-configuration.
This MR attempts to add support for sorting by storage_size while still supporting keyset pagination.
Database review
Optimization issue: Optimize groups storage size sorting in Admin Area (#556662)
Before: /admin/groups?sort=storage_size_desc
Click to expand
SELECT "namespaces".*, "statistics".*
FROM "namespaces",
LATERAL (SELECT COALESCE(SUM("project_statistics"."storage_size"), 0) AS storage_size,
COALESCE(SUM("project_statistics"."repository_size"), 0) AS repository_size,
COALESCE(SUM("project_statistics"."wiki_size"), 0) AS wiki_size,
COALESCE(SUM("project_statistics"."snippets_size"), 0) AS snippets_size,
COALESCE(SUM("project_statistics"."lfs_objects_size"), 0) AS lfs_objects_size,
COALESCE(SUM("project_statistics"."build_artifacts_size"), 0) AS build_artifacts_size,
COALESCE(SUM("project_statistics"."pipeline_artifacts_size"), 0) AS pipeline_artifacts_size,
COALESCE(SUM("project_statistics"."packages_size"), 0) AS packages_size,
COALESCE(SUM("project_statistics"."uploads_size"), 0) AS uploads_size
FROM "project_statistics"
WHERE "project_statistics"."namespace_id" = "namespaces"."id") statistics
WHERE "namespaces"."type" = 'Group'
ORDER BY storage_size DESC, namespaces.id DESC
LIMIT 20 OFFSET 60
After: GraphQL Query
Click to expand
SELECT "namespaces".*, "statistics".*
FROM "namespaces",
LATERAL (SELECT COALESCE(SUM("project_statistics"."storage_size"), 0) AS storage_size,
COALESCE(SUM("project_statistics"."repository_size"), 0) AS repository_size,
COALESCE(SUM("project_statistics"."wiki_size"), 0) AS wiki_size,
COALESCE(SUM("project_statistics"."snippets_size"), 0) AS snippets_size,
COALESCE(SUM("project_statistics"."lfs_objects_size"), 0) AS lfs_objects_size,
COALESCE(SUM("project_statistics"."build_artifacts_size"), 0) AS build_artifacts_size,
COALESCE(SUM("project_statistics"."pipeline_artifacts_size"), 0) AS pipeline_artifacts_size,
COALESCE(SUM("project_statistics"."packages_size"), 0) AS packages_size,
COALESCE(SUM("project_statistics"."uploads_size"), 0) AS uploads_size
FROM "project_statistics"
WHERE "project_statistics"."namespace_id" = "namespaces"."id") statistics
WHERE "namespaces"."type" = 'Group'
ORDER BY storage_size DESC, "namespaces"."id" DESC
LIMIT 101
Screenshots or screen recordings
No visual changes
How to set up and validate locally
- Sign in as an admin user.
- Go to
/-/graphql-explorer - Run the following query
{
groups(allAvailable: true, sort: "storage_size_keyset_desc") {
nodes {
fullName
projectStatistics {
storageSize
}
}
}
}
MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.