Skip to content

Commit 316981c

Browse files
authored
Merge pull request #8737 from eth3lbert/improve-rev-dep
Improve the performance of reverse dependencies using the `default_versions`
2 parents c6f57da + c5754bd commit 316981c

File tree

2 files changed

+31
-32
lines changed

2 files changed

+31
-32
lines changed
+28-32
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,38 @@
1+
WITH filtered_default_versions as (
2+
-- Get all `default_versions` that are depending on the crate $1
3+
SELECT default_versions.*
4+
FROM default_versions
5+
WHERE version_id IN (
6+
SELECT dependencies.version_id
7+
FROM dependencies
8+
WHERE dependencies.crate_id = $1
9+
) AND NOT EXISTS (
10+
-- Filter out yanked crates
11+
-- (if the default version is yanked, then the whole crate is yanked)
12+
SELECT 1
13+
FROM versions
14+
WHERE id = version_id and yanked
15+
)
16+
)
117
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
16-
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
18+
dependencies.*,
19+
crate_downloads.downloads as crate_downloads,
20+
crates.name as crate_name,
21+
(SELECT COUNT(*) from filtered_default_versions) as total
22+
FROM filtered_default_versions
23+
INNER JOIN crates
24+
ON crates.id = filtered_default_versions.crate_id
25+
INNER JOIN crate_downloads using (crate_id)
3326
-- Multiple dependencies can exist, we only want first one
3427
CROSS JOIN LATERAL (
3528
SELECT dependencies.*
3629
FROM dependencies
37-
WHERE dependencies.crate_id = $1 AND dependencies.version_id = crates.version_id
30+
WHERE dependencies.crate_id = $1 AND dependencies.version_id = filtered_default_versions.version_id
3831
ORDER BY id ASC
3932
LIMIT 1
4033
) dependencies
34+
ORDER BY
35+
crate_downloads DESC,
36+
crate_name ASC
4137
OFFSET $2
4238
LIMIT $3

src/tests/builders/krate.rs

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crates_io::{
55
};
66

77
use chrono::NaiveDateTime;
8+
use crates_io::models::update_default_version;
89
use crates_io::schema::crate_downloads;
910
use diesel::prelude::*;
1011

@@ -169,6 +170,8 @@ impl<'a> CrateBuilder<'a> {
169170
.get_result(connection)?;
170171
}
171172

173+
update_default_version(krate.id, connection)?;
174+
172175
Ok(krate)
173176
}
174177

0 commit comments

Comments
 (0)