Use user_group_member_roles table to fetch user custom role permissions

What does this MR do and why?

Add use_user_group_member_roles feature flag to toggle between using the existing query and the new query (introduced in !199106 (merged), fetches from user_group_member_roles table) in UserMemberRolesInGroupsPreloader and UserMemberRolesInProjecsPreloader.

References

Update UserMemberRolesIn*Preloader to read from... (#515216 - closed).

DB changes

UserMemberRolesInGroupsPreloader

New Query

Raw SQL
SELECT
    namespace_ids.namespace_id,
    custom_permissions.permissions
FROM (
    VALUES (67345893, ARRAY[65957873,67345893]),
        (76931177, ARRAY[65957873,76931177])) AS namespace_ids (namespace_id, namespace_ids),
    LATERAL (
        SELECT
            "member_roles"."permissions"
        FROM
            "user_group_member_roles"
            INNER JOIN "member_roles" ON "member_roles"."id" = "user_group_member_roles"."member_role_id"
        WHERE (user_group_member_roles.group_id IN (
                SELECT
                    UNNEST(namespace_ids) AS ids))
            AND "user_group_member_roles"."user_id" = 24586657) AS custom_permissions;

Existing Query

Raw SQL

SELECT
    namespace_ids.namespace_id,
    custom_permissions.permissions
FROM (
    VALUES (67345893, ARRAY[65957873,67345893]),
        (76931177, ARRAY[65957873,76931177])) AS namespace_ids (namespace_id, namespace_ids),
    LATERAL (
        SELECT
            "member_roles"."permissions"
        FROM
            "members"
            JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
            JOIN member_roles ON member_roles.id = group_group_links.member_role_id
        WHERE
            "members"."user_id" = 24586657
            AND (group_group_links.shared_group_id IN (
                    SELECT
                        UNNEST(namespace_ids) AS ids))
                AND (access_level > group_access)
            UNION ALL
            SELECT
                "member_roles"."permissions"
            FROM
                "members"
                JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
                JOIN member_roles ON member_roles.id = members.member_role_id
            WHERE
                "members"."user_id" = 24586657
                AND (group_group_links.shared_group_id IN (
                        SELECT
                            UNNEST(namespace_ids) AS ids))
                    AND ((access_level < group_access)
                        OR (access_level = group_access
                            AND group_group_links.member_role_id IS NOT NULL))
                UNION ALL
                SELECT
                    "member_roles"."permissions"
                FROM
                    "members"
                    INNER JOIN "member_roles" ON "member_roles"."id" = "members"."member_role_id"
                WHERE
                    "members"."user_id" = 24586657
                    AND "members"."source_type" = 'Namespace'
                    AND (members.source_id IN (
                            SELECT
                                UNNEST(namespace_ids) AS ids))
) AS custom_permissions

EXPLAIN: https://console.postgres.ai/shared/59bf5b52-80c9-40e0-bac0-13fbafe7340c

UserMemberRolesInProjectsPreloader

New Query

Raw SQL
SELECT
    project_ids.project_id,
    custom_permissions.permissions
FROM (
    VALUES (62590724, ARRAY[79430960])) AS project_ids (project_id, namespace_ids),
    LATERAL (
        SELECT
            "member_roles"."permissions"
        FROM
            "members"
            INNER JOIN "member_roles" ON "member_roles"."id" = "members"."member_role_id"
        WHERE
            "members"."user_id" = 154136
            AND "members"."source_type" = 'Project'
            AND (members.source_id = project_ids.project_id)
        UNION ALL
        SELECT
            "member_roles"."permissions"
        FROM
            "user_group_member_roles"
            INNER JOIN "member_roles" ON "member_roles"."id" = "user_group_member_roles"."member_role_id"
        WHERE (user_group_member_roles.group_id IN (
                SELECT
                    UNNEST(project_ids.namespace_ids) AS ids))
            AND "user_group_member_roles"."user_id" = 154136) AS custom_permissions

Existing Query

Raw SQL

SELECT
    project_ids.project_id,
    custom_permissions.permissions
FROM (
    VALUES (62590724, ARRAY[79430960])) AS project_ids (project_id, namespace_ids),
    LATERAL (
        SELECT
            "member_roles"."permissions"
        FROM
            "members"
            JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
            JOIN member_roles ON member_roles.id = group_group_links.member_role_id
        WHERE
            "members"."user_id" = 154136
            AND (group_group_links.shared_group_id IN (
                    SELECT
                        UNNEST(project_ids.namespace_ids) AS ids))
                AND (access_level > group_access)
            UNION ALL
            SELECT
                "member_roles"."permissions"
            FROM
                "members"
                JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
                JOIN member_roles ON member_roles.id = members.member_role_id
            WHERE
                "members"."user_id" = 154136
                AND (group_group_links.shared_group_id IN (
                        SELECT
                            UNNEST(project_ids.namespace_ids) AS ids))
                    AND ((access_level < group_access)
                        OR (access_level = group_access
                            AND group_group_links.member_role_id IS NOT NULL))
                UNION ALL
                SELECT
                    "member_roles"."permissions"
                FROM
                    "members"
                    INNER JOIN "member_roles" ON "member_roles"."id" = "members"."member_role_id"
                WHERE
                    "members"."user_id" = 154136
                    AND "members"."source_type" = 'Project'
                    AND (members.source_id = project_ids.project_id)
                UNION ALL
                SELECT
                    "member_roles"."permissions"
                FROM
                    "members"
                    INNER JOIN "member_roles" ON "member_roles"."id" = "members"."member_role_id"
                WHERE
                    "members"."user_id" = 154136
                    AND "members"."source_type" = 'Namespace'
                    AND (members.source_id IN (
                            SELECT
                                UNNEST(project_ids.namespace_ids) AS ids))) AS custom_permissions

EXPLAIN: https://console.postgres.ai/shared/1ce82068-d63c-4c06-aba7-ef0d03e71f3c

Screenshots or screen recordings

Before After

How to set up and validate locally

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 Eugie Limpin

Merge request reports

Loading