From d9d5f541579aa4629c3dc725c3c81fde3dd69495 Mon Sep 17 00:00:00 2001 From: Victor Song Date: Tue, 13 Feb 2024 00:46:08 -0600 Subject: [PATCH] Move logic for checking unyanked releases into SQL --- ...0af2fa3d4aaca158c3b616f2e683a943bccb.json} | 12 +--- src/web/releases.rs | 72 +++++++------------ templates/releases/releases.html | 4 +- 3 files changed, 32 insertions(+), 56 deletions(-) rename .sqlx/{query-659b0ce566bd1daf4a8236f3362f41bc7a5a0cc21ebcf2e71fa19bc91e6c7302.json => query-7e833553cf419d8fbc3a5a0c504f0af2fa3d4aaca158c3b616f2e683a943bccb.json} (64%) diff --git a/.sqlx/query-659b0ce566bd1daf4a8236f3362f41bc7a5a0cc21ebcf2e71fa19bc91e6c7302.json b/.sqlx/query-7e833553cf419d8fbc3a5a0c504f0af2fa3d4aaca158c3b616f2e683a943bccb.json similarity index 64% rename from .sqlx/query-659b0ce566bd1daf4a8236f3362f41bc7a5a0cc21ebcf2e71fa19bc91e6c7302.json rename to .sqlx/query-7e833553cf419d8fbc3a5a0c504f0af2fa3d4aaca158c3b616f2e683a943bccb.json index 8863de8bd..26913656c 100644 --- a/.sqlx/query-659b0ce566bd1daf4a8236f3362f41bc7a5a0cc21ebcf2e71fa19bc91e6c7302.json +++ b/.sqlx/query-7e833553cf419d8fbc3a5a0c504f0af2fa3d4aaca158c3b616f2e683a943bccb.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n crates.name,\n releases.version,\n releases.description,\n builds.build_time,\n releases.target_name,\n releases.rustdoc_status,\n repositories.stars as \"stars?\",\n releases.yanked,\n crates.latest_version_id = releases.id AS \"is_latest_version!\"\n\n FROM crates\n INNER JOIN releases ON crates.id = releases.crate_id\n INNER JOIN builds ON releases.id = builds.rid\n LEFT JOIN repositories ON releases.repository_id = repositories.id\n\n WHERE crates.name = ANY($1)", + "query": "SELECT\n crates.name,\n releases.version,\n releases.description,\n builds.build_time,\n releases.target_name,\n releases.rustdoc_status,\n repositories.stars as \"stars?\",\n EXISTS (\n SELECT 1\n FROM releases AS all_releases\n WHERE\n all_releases.crate_id = crates.id AND\n all_releases.yanked = false\n ) AS has_unyanked_releases\n\n FROM crates\n INNER JOIN releases ON crates.latest_version_id = releases.id\n INNER JOIN builds ON releases.id = builds.rid\n LEFT JOIN repositories ON releases.repository_id = repositories.id\n\n WHERE crates.name = ANY($1)", "describe": { "columns": [ { @@ -40,12 +40,7 @@ }, { "ordinal": 7, - "name": "yanked", - "type_info": "Bool" - }, - { - "ordinal": 8, - "name": "is_latest_version!", + "name": "has_unyanked_releases", "type_info": "Bool" } ], @@ -62,9 +57,8 @@ false, false, false, - false, null ] }, - "hash": "659b0ce566bd1daf4a8236f3362f41bc7a5a0cc21ebcf2e71fa19bc91e6c7302" + "hash": "7e833553cf419d8fbc3a5a0c504f0af2fa3d4aaca158c3b616f2e683a943bccb" } diff --git a/src/web/releases.rs b/src/web/releases.rs index 05f4f7230..a3c4282a0 100644 --- a/src/web/releases.rs +++ b/src/web/releases.rs @@ -49,9 +49,7 @@ pub struct Release { rustdoc_status: bool, pub(crate) build_time: DateTime, stars: i32, - yanked: bool, - is_latest_version: bool, - all_versions_yanked: Option, + has_unyanked_releases: Option, } #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -92,9 +90,7 @@ pub(crate) async fn get_releases( releases.target_name, releases.rustdoc_status, builds.build_time, - repositories.stars, - releases.yanked, - crates.latest_version_id = releases.id AS \"is_latest_version!\" + repositories.stars FROM crates {1} INNER JOIN builds ON releases.id = builds.rid @@ -126,9 +122,7 @@ pub(crate) async fn get_releases( rustdoc_status: row.get(4), build_time: row.get(5), stars: row.get::, _>(6).unwrap_or(0), - yanked: row.get(7), - is_latest_version: row.get(8), - all_versions_yanked: None, + has_unyanked_releases: None, }) .try_collect() .await?) @@ -240,7 +234,7 @@ async fn get_search_results( // So for now we are using the version with the youngest release_time. // This is different from all other release-list views where we show // our latest build. - let crates: HashMap> = sqlx::query!( + let crates: HashMap = sqlx::query!( r#"SELECT crates.name, releases.version, @@ -249,11 +243,16 @@ async fn get_search_results( releases.target_name, releases.rustdoc_status, repositories.stars as "stars?", - releases.yanked, - crates.latest_version_id = releases.id AS "is_latest_version!" + EXISTS ( + SELECT 1 + FROM releases AS all_releases + WHERE + all_releases.crate_id = crates.id AND + all_releases.yanked = false + ) AS has_unyanked_releases FROM crates - INNER JOIN releases ON crates.id = releases.crate_id + INNER JOIN releases ON crates.latest_version_id = releases.id INNER JOIN builds ON releases.id = builds.rid LEFT JOIN repositories ON releases.repository_id = repositories.id @@ -261,41 +260,24 @@ async fn get_search_results( &names[..], ) .fetch(&mut *conn) - .try_fold(HashMap::new(), |mut acc: HashMap<_, Vec<_>>, row| { - acc.entry(row.name.clone()).or_default().push(Release { - name: row.name, - version: row.version, - description: row.description, - build_time: row.build_time, - target_name: Some(row.target_name), - rustdoc_status: row.rustdoc_status, - stars: row.stars.unwrap_or(0), - yanked: row.yanked, - is_latest_version: row.is_latest_version, - all_versions_yanked: None, - }); - - async move { Ok(acc) } + .map_ok(|row| { + ( + row.name.clone(), + Release { + name: row.name, + version: row.version, + description: row.description, + build_time: row.build_time, + target_name: Some(row.target_name), + rustdoc_status: row.rustdoc_status, + stars: row.stars.unwrap_or(0), + has_unyanked_releases: row.has_unyanked_releases, + }, + ) }) + .try_collect() .await?; - let crates: HashMap = crates - .into_iter() - .map(|(name, releases)| { - let mut release = releases - .iter() - .find(|release| release.is_latest_version) - .cloned() - .unwrap_or(releases[0].clone()); - - if releases.iter().all(|release| release.yanked) { - release.all_versions_yanked = Some(true); - } - - (name, release) - }) - .collect(); - Ok(SearchResult { // start with the original names from crates.io to keep the original ranking, // extend with the release/build information from docs.rs diff --git a/templates/releases/releases.html b/templates/releases/releases.html index 9a4ad29a0..24e0eb961 100644 --- a/templates/releases/releases.html +++ b/templates/releases/releases.html @@ -27,8 +27,8 @@ {# TODO: If there are no releases, then display a message that says so #} {%- for release in releases -%} {%- set release_version = release.version -%} - {%- set all_versions_yanked = release.all_versions_yanked | default(value=false) -%} - {%- if release_type == "search" and not all_versions_yanked -%} + {%- set has_unyanked_releases = release.has_unyanked_releases | default(value=true) -%} + {%- if release_type == "search" and has_unyanked_releases -%} {%- set release_version = "latest" -%} {%- endif -%} {%- if release.rustdoc_status -%}