Create Packages::Nuget::Package class

Context

Step by step we want to complete the refactoring and extract every package format from Packages::Package to its own class.

What does this MR do and why?

This MR introduces Packages::Nuget::Package class for NuGet packages.

NuGet package registry is in GA https://docs.gitlab.com/ee/user/packages/nuget_repository/, hence the changes are introduced with the feature flag.

References

Please include cross links to any resources that are relevant to this MR This will give reviewers and future readers helpful context to give an efficient review of the changes introduced.

MR acceptance checklist

Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Screenshots or screen recordings

No.

Database analysis

  • Packages::Nuget::PackageFinder app/finders/packages/nuget/package_finder.rb

With project. master branch

SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."project_id" = XXX
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."package_type" = 4
  AND "packages_packages"."version" IS NOT NULL
  AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101976

With project. Current MR

SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
  AND "packages_packages"."project_id" = XXX
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."version" IS NOT NULL
  AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101974

With group. master branch

SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."project_id" IN
    (SELECT "projects"."id"
     FROM "projects"
     WHERE (EXISTS
              (SELECT 1
               FROM "project_authorizations"
               WHERE "project_authorizations"."user_id" = XXX
                 AND (project_authorizations.project_id = projects.id)
                 AND (project_authorizations.access_level >= 20))
            OR projects.visibility_level IN (10,
                                             20)
            OR EXISTS
              (SELECT 1
               FROM "project_features"
               WHERE "project_features"."project_id" = "projects"."id"
                 AND "project_features"."package_registry_access_level" = 30))
       AND "projects"."namespace_id" IN
         (SELECT "namespaces"."id"
          FROM "namespaces"
          WHERE "namespaces"."type" = 'Group'
            AND (traversal_ids @> ('{XXX}'))))
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."package_type" = 4
  AND "packages_packages"."version" IS NOT NULL
  AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101984

With group. Current MR

SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
  AND "packages_packages"."project_id" IN
    (SELECT "projects"."id"
     FROM "projects"
     WHERE (EXISTS
              (SELECT 1
               FROM "project_authorizations"
               WHERE "project_authorizations"."user_id" = XXX
                 AND (project_authorizations.project_id = projects.id)
                 AND (project_authorizations.access_level >= 20))
            OR projects.visibility_level IN (10,
                                             20)
            OR EXISTS
              (SELECT 1
               FROM "project_features"
               WHERE "project_features"."project_id" = "projects"."id"
                 AND "project_features"."package_registry_access_level" = 30))
       AND "projects"."namespace_id" IN
         (SELECT "namespaces"."id"
          FROM "namespaces"
          WHERE "namespaces"."type" = 'Group'
            AND (traversal_ids @> ('{XXX}'))))
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."version" IS NOT NULL
  AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101981

  • Packages::Nuget::SearchService app/services/packages/nuget/search_service.rb

With project. master branch

SELECT partition_subquery.id,
       partition_subquery.project_id,
       partition_subquery.created_at,
       partition_subquery.updated_at,
       partition_subquery.name,
       partition_subquery.version,
       partition_subquery.package_type,
       partition_subquery.creator_id,
       partition_subquery.status,
       partition_subquery.last_downloaded_at,
       partition_subquery.status_message
FROM
  (SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
                             ORDER BY packages_packages.created_at DESC) AS row_number,
          packages_packages.*
   FROM "packages_packages"
   WHERE "packages_packages"."package_type" = 4
     AND "packages_packages"."status" IN (0,
                                          1)
     AND "packages_packages"."version" IS NOT NULL
     AND "packages_packages"."name" IN
       (SELECT DISTINCT "packages_packages"."name"
        FROM "packages_packages"
        WHERE "packages_packages"."package_type" = 4
          AND "packages_packages"."status" IN (0,
                                               1)
          AND "packages_packages"."version" IS NOT NULL
          AND "packages_packages"."project_id" = XXX
          AND "packages_packages"."name" ILIKE '%XXX%'
        ORDER BY "packages_packages"."name" ASC
        LIMIT 5
        OFFSET 0)
     AND "packages_packages"."project_id" = XXX) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102001

SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."version" IS NOT NULL
  AND "packages_packages"."project_id" = XXX
  AND "packages_packages"."name" ILIKE '%XXX%';

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102028

With project. Current MR

SELECT partition_subquery.id,
       partition_subquery.project_id,
       partition_subquery.created_at,
       partition_subquery.updated_at,
       partition_subquery.name,
       partition_subquery.version,
       partition_subquery.package_type,
       partition_subquery.creator_id,
       partition_subquery.status,
       partition_subquery.last_downloaded_at,
       partition_subquery.status_message
FROM
  (SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
                             ORDER BY packages_packages.created_at DESC) AS row_number,
          packages_packages.*
   FROM "packages_packages"
   WHERE "packages_packages"."package_type" = 4
     AND "packages_packages"."status" IN (0,
                                          1)
     AND "packages_packages"."version" IS NOT NULL
     AND "packages_packages"."name" IN
       (SELECT DISTINCT "packages_packages"."name"
        FROM "packages_packages"
        WHERE "packages_packages"."package_type" = 4
          AND "packages_packages"."status" IN (0,
                                               1)
          AND "packages_packages"."version" IS NOT NULL
          AND "packages_packages"."project_id" = XXX
          AND "packages_packages"."name" ILIKE '%XXX%'
        ORDER BY "packages_packages"."name" ASC
        LIMIT 5
        OFFSET 0)
     AND "packages_packages"."project_id" = XXX) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101998

SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."version" IS NOT NULL
  AND "packages_packages"."project_id" = XXX
  AND "packages_packages"."name" ILIKE '%XXX%';

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102031

With group. master branch

WITH "project_ids" AS MATERIALIZED
  (SELECT "projects"."id"
   FROM "projects"
   WHERE (EXISTS
            (SELECT 1
             FROM "project_authorizations"
             WHERE "project_authorizations"."user_id" = XXX
               AND (project_authorizations.project_id = projects.id)
               AND (project_authorizations.access_level >= 20))
          OR projects.visibility_level IN (10, 20)
          OR EXISTS
            (SELECT 1
             FROM "project_features"
             WHERE "project_features"."project_id" = "projects"."id"
               AND "project_features"."package_registry_access_level" = 30))
     AND "projects"."namespace_id" IN
       (SELECT "namespaces"."id"
        FROM "namespaces"
        WHERE "namespaces"."type" = 'Group'
          AND (traversal_ids @> ('{XXX}'))))
SELECT partition_subquery.id,
       partition_subquery.project_id,
       partition_subquery.created_at,
       partition_subquery.updated_at,
       partition_subquery.name,
       partition_subquery.version,
       partition_subquery.package_type,
       partition_subquery.creator_id,
       partition_subquery.status,
       partition_subquery.last_downloaded_at,
       partition_subquery.status_message
FROM
  (SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
                             ORDER BY packages_packages.created_at DESC) AS row_number,
          packages_packages.*
   FROM "packages_packages"
   WHERE "packages_packages"."package_type" = 4
     AND "packages_packages"."status" IN (0,
                                          1)
     AND "packages_packages"."version" IS NOT NULL
     AND "packages_packages"."name" IN
       (SELECT DISTINCT "packages_packages"."name"
        FROM "packages_packages"
        WHERE "packages_packages"."package_type" = 4
          AND "packages_packages"."status" IN (0,
                                               1)
          AND "packages_packages"."version" IS NOT NULL
          AND "packages_packages"."project_id" IN
            (SELECT "id"
             FROM "project_ids")
          AND "packages_packages"."name" ILIKE '%XXX%'
        ORDER BY "packages_packages"."name" ASC
        LIMIT 5
        OFFSET 0)
     AND "packages_packages"."project_id" IN
       (SELECT "id"
        FROM "project_ids")) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102014

WITH "project_ids" AS MATERIALIZED
  (SELECT "projects"."id"
   FROM "projects"
   WHERE (EXISTS
            (SELECT 1
             FROM "project_authorizations"
             WHERE "project_authorizations"."user_id" = XXX
               AND (project_authorizations.project_id = projects.id)
               AND (project_authorizations.access_level >= 20))
          OR projects.visibility_level IN (10, 20)
          OR EXISTS
            (SELECT 1
             FROM "project_features"
             WHERE "project_features"."project_id" = "projects"."id"
               AND "project_features"."package_registry_access_level" = 30))
     AND "projects"."namespace_id" IN
       (SELECT "namespaces"."id"
        FROM "namespaces"
        WHERE "namespaces"."type" = 'Group'
          AND (traversal_ids @> ('{XXX}'))))
SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."version" IS NOT NULL
  AND "packages_packages"."project_id" IN
    (SELECT "id"
     FROM "project_ids")
  AND "packages_packages"."name" ILIKE '%XXX%';

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102016

With group. Current MR

WITH "project_ids" AS MATERIALIZED
  (SELECT "projects"."id"
   FROM "projects"
   WHERE (EXISTS
            (SELECT 1
             FROM "project_authorizations"
             WHERE "project_authorizations"."user_id" = XXX
               AND (project_authorizations.project_id = projects.id)
               AND (project_authorizations.access_level >= 20))
          OR projects.visibility_level IN (10, 20)
          OR EXISTS
            (SELECT 1
             FROM "project_features"
             WHERE "project_features"."project_id" = "projects"."id"
               AND "project_features"."package_registry_access_level" = 30))
     AND "projects"."namespace_id" IN
       (SELECT "namespaces"."id"
        FROM "namespaces"
        WHERE "namespaces"."type" = 'Group'
          AND (traversal_ids @> ('{XXX}'))))
SELECT partition_subquery.id,
       partition_subquery.project_id,
       partition_subquery.created_at,
       partition_subquery.updated_at,
       partition_subquery.name,
       partition_subquery.version,
       partition_subquery.package_type,
       partition_subquery.creator_id,
       partition_subquery.status,
       partition_subquery.last_downloaded_at,
       partition_subquery.status_message
FROM
  (SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
                             ORDER BY packages_packages.created_at DESC) AS row_number,
          packages_packages.*
   FROM "packages_packages"
   WHERE "packages_packages"."package_type" = 4
     AND "packages_packages"."status" IN (0,
                                          1)
     AND "packages_packages"."version" IS NOT NULL
     AND "packages_packages"."name" IN
       (SELECT DISTINCT "packages_packages"."name"
        FROM "packages_packages"
        WHERE "packages_packages"."package_type" = 4
          AND "packages_packages"."status" IN (0,
                                               1)
          AND "packages_packages"."version" IS NOT NULL
          AND "packages_packages"."project_id" IN
            (SELECT "id"
             FROM "project_ids")
          AND "packages_packages"."name" ILIKE '%XXX%'
        ORDER BY "packages_packages"."name" ASC
        LIMIT 5
        OFFSET 0)
     AND "packages_packages"."project_id" IN
       (SELECT "id"
        FROM "project_ids")) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102010

WITH "project_ids" AS MATERIALIZED
  (SELECT "projects"."id"
   FROM "projects"
   WHERE (EXISTS
            (SELECT 1
             FROM "project_authorizations"
             WHERE "project_authorizations"."user_id" = XXX
               AND (project_authorizations.project_id = projects.id)
               AND (project_authorizations.access_level >= 20))
          OR projects.visibility_level IN (10, 20)
          OR EXISTS
            (SELECT 1
             FROM "project_features"
             WHERE "project_features"."project_id" = "projects"."id"
               AND "project_features"."package_registry_access_level" = 30))
     AND "projects"."namespace_id" IN
       (SELECT "namespaces"."id"
        FROM "namespaces"
        WHERE "namespaces"."type" = 'Group'
          AND (traversal_ids @> ('{XXX}'))))
SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
  AND "packages_packages"."status" IN (0,
                                       1)
  AND "packages_packages"."version" IS NOT NULL
  AND "packages_packages"."project_id" IN
    (SELECT "id"
     FROM "project_ids")
  AND "packages_packages"."name" ILIKE '%XXX%';

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102023

How to set up and validate locally

  1. Enable the feature flag: Feature.enable(:nuget_extract_nuget_package_model)
  2. Try basic package registry actions like publishing and installing a package docs.

Related to #435826 (closed)

Edited by Dzmitry (Dima) Meshcharakou

Merge request reports

Loading