Skip to content

Commit fc6ce05

Browse files
Tyrubiassyphar
authored andcommitted
Move logic for checking unyanked releases into SQL
1 parent 468c47b commit fc6ce05

File tree

3 files changed

+32
-56
lines changed

3 files changed

+32
-56
lines changed

.sqlx/query-659b0ce566bd1daf4a8236f3362f41bc7a5a0cc21ebcf2e71fa19bc91e6c7302.json .sqlx/query-7e833553cf419d8fbc3a5a0c504f0af2fa3d4aaca158c3b616f2e683a943bccb.json

+3-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/web/releases.rs

+27-45
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ pub struct Release {
4949
rustdoc_status: bool,
5050
pub(crate) build_time: DateTime<Utc>,
5151
stars: i32,
52-
yanked: bool,
53-
is_latest_version: bool,
54-
all_versions_yanked: Option<bool>,
52+
has_unyanked_releases: Option<bool>,
5553
}
5654

5755
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
@@ -92,9 +90,7 @@ pub(crate) async fn get_releases(
9290
releases.target_name,
9391
releases.rustdoc_status,
9492
builds.build_time,
95-
repositories.stars,
96-
releases.yanked,
97-
crates.latest_version_id = releases.id AS \"is_latest_version!\"
93+
repositories.stars
9894
FROM crates
9995
{1}
10096
INNER JOIN builds ON releases.id = builds.rid
@@ -126,9 +122,7 @@ pub(crate) async fn get_releases(
126122
rustdoc_status: row.get(4),
127123
build_time: row.get(5),
128124
stars: row.get::<Option<i32>, _>(6).unwrap_or(0),
129-
yanked: row.get(7),
130-
is_latest_version: row.get(8),
131-
all_versions_yanked: None,
125+
has_unyanked_releases: None,
132126
})
133127
.try_collect()
134128
.await?)
@@ -240,7 +234,7 @@ async fn get_search_results(
240234
// So for now we are using the version with the youngest release_time.
241235
// This is different from all other release-list views where we show
242236
// our latest build.
243-
let crates: HashMap<String, Vec<Release>> = sqlx::query!(
237+
let crates: HashMap<String, Release> = sqlx::query!(
244238
r#"SELECT
245239
crates.name,
246240
releases.version,
@@ -249,53 +243,41 @@ async fn get_search_results(
249243
releases.target_name,
250244
releases.rustdoc_status,
251245
repositories.stars as "stars?",
252-
releases.yanked,
253-
crates.latest_version_id = releases.id AS "is_latest_version!"
246+
EXISTS (
247+
SELECT 1
248+
FROM releases AS all_releases
249+
WHERE
250+
all_releases.crate_id = crates.id AND
251+
all_releases.yanked = false
252+
) AS has_unyanked_releases
254253
255254
FROM crates
256-
INNER JOIN releases ON crates.id = releases.crate_id
255+
INNER JOIN releases ON crates.latest_version_id = releases.id
257256
INNER JOIN builds ON releases.id = builds.rid
258257
LEFT JOIN repositories ON releases.repository_id = repositories.id
259258
260259
WHERE crates.name = ANY($1)"#,
261260
&names[..],
262261
)
263262
.fetch(&mut *conn)
264-
.try_fold(HashMap::new(), |mut acc: HashMap<_, Vec<_>>, row| {
265-
acc.entry(row.name.clone()).or_default().push(Release {
266-
name: row.name,
267-
version: row.version,
268-
description: row.description,
269-
build_time: row.build_time,
270-
target_name: Some(row.target_name),
271-
rustdoc_status: row.rustdoc_status,
272-
stars: row.stars.unwrap_or(0),
273-
yanked: row.yanked,
274-
is_latest_version: row.is_latest_version,
275-
all_versions_yanked: None,
276-
});
277-
278-
async move { Ok(acc) }
263+
.map_ok(|row| {
264+
(
265+
row.name.clone(),
266+
Release {
267+
name: row.name,
268+
version: row.version,
269+
description: row.description,
270+
build_time: row.build_time,
271+
target_name: Some(row.target_name),
272+
rustdoc_status: row.rustdoc_status,
273+
stars: row.stars.unwrap_or(0),
274+
has_unyanked_releases: row.has_unyanked_releases,
275+
},
276+
)
279277
})
278+
.try_collect()
280279
.await?;
281280

282-
let crates: HashMap<String, Release> = crates
283-
.into_iter()
284-
.map(|(name, releases)| {
285-
let mut release = releases
286-
.iter()
287-
.find(|release| release.is_latest_version)
288-
.cloned()
289-
.unwrap_or(releases[0].clone());
290-
291-
if releases.iter().all(|release| release.yanked) {
292-
release.all_versions_yanked = Some(true);
293-
}
294-
295-
(name, release)
296-
})
297-
.collect();
298-
299281
Ok(SearchResult {
300282
// start with the original names from crates.io to keep the original ranking,
301283
// extend with the release/build information from docs.rs

templates/releases/releases.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
{# TODO: If there are no releases, then display a message that says so #}
2828
{%- for release in releases -%}
2929
{%- set release_version = release.version -%}
30-
{%- set all_versions_yanked = release.all_versions_yanked | default(value=false) -%}
31-
{%- if release_type == "search" and not all_versions_yanked -%}
30+
{%- set has_unyanked_releases = release.has_unyanked_releases | default(value=true) -%}
31+
{%- if release_type == "search" and has_unyanked_releases -%}
3232
{%- set release_version = "latest" -%}
3333
{%- endif -%}
3434
{%- if release.rustdoc_status -%}

0 commit comments

Comments
 (0)