Fix approval groups finder
What does this MR do and why?
This MR updates the query to find the accessible groups to the user in the approval group finder.
Database queries
This MR relies on the scope accessible_to_user introduced by this MR.
SELECT
    namespaces.*
FROM
    "namespaces"
WHERE
    "namespaces"."type" = 'Group'
    AND "namespaces"."id" IN (70820400, 86692579)https://postgres.ai/console/gitlab/gitlab-production-main/sessions/28694/commands/89387
app/models/preloaders/user_max_access_level_in_groups_preloader.rb:24:
def preload_with_traversal_ids
      # Diagrammatic representation of this step:
      # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111157#note_1271550140
      max_access_levels = GroupMember.from_union(all_memberships)
                            .joins("INNER JOIN (#{traversal_join_sql}) as hierarchy ON members.source_id = hierarchy.traversal_id")
                            .group('hierarchy.id')
                            .maximum(:access_level)
      @groups.each do |group|
        max_access_level = max_access_levels[group.id] || Gitlab::Access::NO_ACCESS
        group.merge_value_to_request_store(User, @user.id, max_access_level)
      end
    endSELECT
    MAX("members"."access_level") AS "maximum_access_level",
    "hierarchy"."id" AS "hierarchy_id"
FROM ((
        SELECT
            "members"."id",
            "members"."access_level",
            "members"."source_id",
            "members"."source_type",
            "members"."user_id",
            "members"."notification_level",
            "members"."type",
            "members"."created_at",
            "members"."updated_at",
            "members"."created_by_id",
            "members"."invite_email",
            "members"."invite_token",
            "members"."invite_accepted_at",
            "members"."requested_at",
            "members"."expires_at",
            "members"."ldap",
            "members"."override",
            "members"."state",
            "members"."invite_email_success",
            "members"."member_namespace_id",
            "members"."member_role_id",
            "members"."expiry_notified_at",
            "members"."request_accepted_at",
            "members"."last_activity_on"
        FROM
            "members"
        LEFT OUTER JOIN "users" ON "users"."id" = "members"."user_id"
WHERE
    "members"."type" = 'GroupMember'
    AND "members"."source_type" = 'Namespace'
    AND "users"."state" = 'active'
    AND "members"."state" = 0
    AND "members"."requested_at" IS NULL
    AND "members"."invite_token" IS NULL
    AND (members.access_level > 5)
    AND "members"."user_id" = 9430722
    /* allow_cross_joins_across_databases */)
UNION (
    SELECT
        "members"."id",
        LEAST ("group_group_links"."group_access", "members"."access_level") AS access_level,
        "group_group_links"."shared_group_id" AS source_id,
        "members"."source_type",
        "members"."user_id",
        "members"."notification_level",
        "members"."type",
        "members"."created_at",
        "members"."updated_at",
        "members"."created_by_id",
        "members"."invite_email",
        "members"."invite_token",
        "members"."invite_accepted_at",
        "members"."requested_at",
        "members"."expires_at",
        "members"."ldap",
        "members"."override",
        "members"."state",
        "members"."invite_email_success",
        "members"."member_namespace_id",
        "members"."member_role_id",
        "members"."expiry_notified_at",
        "members"."request_accepted_at",
        "members"."last_activity_on"
    FROM
        "members"
    LEFT OUTER JOIN "users" ON "users"."id" = "members"."user_id"
INNER JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
WHERE
    "members"."type" = 'GroupMember'
    AND "members"."source_type" = 'Namespace'
    AND "users"."state" = 'active'
    AND "members"."state" = 0
    AND "members"."requested_at" IS NULL
    AND "members"."invite_token" IS NULL
    AND (members.access_level > 5)
    AND "members"."user_id" = 9430722
    /* allow_cross_joins_across_databases */)) members
    INNER JOIN (
        SELECT
            id,
            unnest(traversal_ids) AS traversal_id
        FROM
            "namespaces"
        WHERE
            "namespaces"."id" IN (70820400, 86692579)) AS hierarchy ON members.source_id = hierarchy.traversal_id
WHERE
    "members"."type" = 'GroupMember'
    AND "members"."source_type" = 'Namespace'
GROUP BY
    "hierarchy"."id"https://postgres.ai/console/gitlab/gitlab-production-main/sessions/28694/commands/89393
SELECT
    namespaces.*,
    root_query.id AS source_id
FROM
    "namespaces"
    INNER JOIN (
        SELECT
            id,
            traversal_ids[1] AS root_id
        FROM
            "namespaces"
        WHERE
            "namespaces"."type" = 'Group'
            AND "namespaces"."id" IN (70820400, 86692579)) AS root_query ON root_query.root_id = namespaces.idhttps://postgres.ai/console/gitlab/gitlab-production-main/sessions/28694/commands/89394
SELECT
    1 AS one
FROM
    "organization_users"
WHERE
    "organization_users"."user_id" = 9430722
    AND "organization_users"."organization_id" = 1
    AND "organization_users"."access_level" = 50
LIMIT 1https://postgres.ai/console/gitlab/gitlab-production-main/sessions/28694/commands/89395
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.