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

  1. Sign in as an admin user.
  2. Go to /-/graphql-explorer
  3. 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.

Edited by Shane Maglangit

Merge request reports

Loading