Skip to content

Commit 53b1493

Browse files
committed
Improve the performance of reverse dependencies using the default_versions
1 parent 39964df commit 53b1493

File tree

1 file changed

+22
-32
lines changed

1 file changed

+22
-32
lines changed
Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,32 @@
1-
SELECT
2-
dependencies.*, crate_downloads, crate_name, total
3-
FROM (
4-
-- Apply pagination to the crates
5-
SELECT *, COUNT(*) OVER () as total FROM (
6-
SELECT
7-
crate_downloads.downloads AS crate_downloads,
8-
crates.name AS crate_name,
9-
versions.id AS version_id
10-
FROM
11-
-- We only want the crates whose *max* version is dependent, so we join on a
12-
-- subselect that includes the versions with their ordinal position
13-
(
14-
SELECT DISTINCT ON (crate_id)
15-
crate_id, semver_no_prerelease, id
1+
WITH default_versions as (
2+
SELECT default_versions.*
3+
FROM default_versions
4+
WHERE version_id IN (SELECT version_id FROM dependencies WHERE crate_id = $1)
5+
AND NOT EXISTS (
6+
SELECT 1
167
FROM versions
17-
WHERE NOT yanked
18-
ORDER BY
19-
crate_id,
20-
semver_no_prerelease DESC NULLS LAST,
21-
id DESC
22-
) versions
23-
INNER JOIN crates
24-
ON crates.id = versions.crate_id
25-
INNER JOIN crate_downloads
26-
ON crate_downloads.crate_id = crates.id
27-
WHERE versions.id IN (SELECT version_id FROM dependencies WHERE crate_id = $1)
28-
) c
29-
ORDER BY
30-
crate_downloads DESC,
31-
crate_name ASC
32-
) crates
8+
WHERE id = version_id and yanked
9+
)
10+
)
11+
SELECT
12+
dependencies.*,
13+
crate_downloads.downloads as crate_downloads,
14+
crates.name as crate_name,
15+
(SELECT COUNT(*) from default_versions) as total
16+
FROM default_versions
17+
INNER JOIN crates
18+
ON crates.id = default_versions.crate_id
19+
INNER JOIN crate_downloads using (crate_id)
3320
-- Multiple dependencies can exist, we only want first one
3421
CROSS JOIN LATERAL (
3522
SELECT dependencies.*
3623
FROM dependencies
37-
WHERE dependencies.crate_id = $1 AND dependencies.version_id = crates.version_id
24+
WHERE dependencies.crate_id = $1 AND dependencies.version_id = default_versions.version_id
3825
ORDER BY id ASC
3926
LIMIT 1
4027
) dependencies
28+
ORDER BY
29+
crate_downloads DESC,
30+
crate_name ASC
4131
OFFSET $2
4232
LIMIT $3

0 commit comments

Comments
 (0)