Skip to content

Take into account design_id when fetching resized design images

What does this MR do and why?

MR updates the way resized design images are served. The first implementation (see b6ee6cdf) solved issue by modifying the existing sub query (by filtering selection by issue_id) which was working well and was issuing the same amount of queries as current master. But in the end I picked solution that you see here (see 8ec14e94) which does an extra query (to fetch design version by sha) but DB queries that it produces are simpler (basically the same queries as in version 1 but unwrapped) and easier to follow.

Why

For more info check the #386148

Screenshots or screen recordings

DB queries

Before:

SELECT
    DISTINCT ON (design_management_designs_versions.design_id) design_management_designs_versions.*
FROM
    "design_management_designs_versions"
WHERE
    "design_management_designs_versions"."design_id" = ?
    AND "design_management_designs_versions"."version_id" <= (
        SELECT
            "design_management_versions"."id"
        FROM
            "design_management_versions"
        WHERE
            "design_management_versions"."sha" = ?
    )
ORDER BY
    "design_management_designs_versions"."design_id" ASC,
    "design_management_designs_versions"."version_id" DESC;

Query explanation | private link

After:

# Query 1 (Issued by `design.versions.find_by_sha(sha)`)
SELECT
    "design_management_versions".*
FROM
    "design_management_versions"
    INNER JOIN "design_management_designs_versions" ON "design_management_versions"."id" = "design_management_designs_versions"."version_id"
WHERE
    "design_management_designs_versions"."design_id" = ?
    AND "design_management_versions"."sha" = ?
LIMIT
    1

# Query 2 ("version_id" <= ? value is taken from result of previous query)
SELECT
    DISTINCT ON (design_management_designs_versions.design_id) design_management_designs_versions.*
FROM
    "design_management_designs_versions"
WHERE
    "design_management_designs_versions"."design_id" = ?
    AND "design_management_designs_versions"."version_id" <= ?
ORDER BY
    "design_management_designs_versions"."design_id" ASC,
    "design_management_designs_versions"."version_id" DESC
LIMIT
    1

Query 1 explanation | private link

Query 2 explanation | private link

How to set up and validate locally

  1. Pick 2 issues and upload a different design image to each of it (Just in case, sample issue URLs: http://gdk.test:3000/flightjs/Flight/-/issues/1, http://gdk.test:3000/flightjs/Flight/-/issues/2)
  2. Run DesignManagement::Version.last(2).map { |v| v.update(sha: "5b2f845642849871ab359cb4938fe2b75950adb6") } (Set their version hash to the same sha)
  3. Refresh the issue pages (from 1.), previews should still be rendered (You can also drop cache or restart rails + webpack to be sure that it's not just a cache)

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Fixes #386148

Edited by Stanislav Dobrovolschii

Merge request reports