From fd8bb8ba73d9fb410adb315c8acf1d1dde36c020 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 24 Jul 2025 07:22:11 +0200 Subject: [PATCH 1/2] Remove `RecentCrateDownloads` struct We were only using it for the `belonging_to()` association, but we can easily achieve the same with a simple `filter()` call. Since each model struct is generating a considerate amount of code lets remove it until we actually need it. --- crates/crates_io_database/src/models/krate.rs | 12 ------------ crates/crates_io_database/src/models/mod.rs | 2 +- src/controllers/krate/metadata.rs | 7 ++++--- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/crates/crates_io_database/src/models/krate.rs b/crates/crates_io_database/src/models/krate.rs index 7b84462aa74..6a8a926891e 100644 --- a/crates/crates_io_database/src/models/krate.rs +++ b/crates/crates_io_database/src/models/krate.rs @@ -18,18 +18,6 @@ use tracing::instrument; use super::Team; -#[derive(Debug, Queryable, Identifiable, Associations, Clone, Copy)] -#[diesel( - table_name = recent_crate_downloads, - check_for_backend(diesel::pg::Pg), - primary_key(crate_id), - belongs_to(Crate), -)] -pub struct RecentCrateDownloads { - pub crate_id: i32, - pub downloads: i32, -} - #[derive(Debug, Clone, Queryable, Selectable)] #[diesel(table_name = crates, check_for_backend(diesel::pg::Pg))] pub struct CrateName { diff --git a/crates/crates_io_database/src/models/mod.rs b/crates/crates_io_database/src/models/mod.rs index 25c7726ecfa..d69fbfcbb7f 100644 --- a/crates/crates_io_database/src/models/mod.rs +++ b/crates/crates_io_database/src/models/mod.rs @@ -10,7 +10,7 @@ pub use self::download::VersionDownload; pub use self::email::{Email, NewEmail}; pub use self::follow::Follow; pub use self::keyword::{CrateKeyword, Keyword}; -pub use self::krate::{Crate, CrateName, NewCrate, RecentCrateDownloads}; +pub use self::krate::{Crate, CrateName, NewCrate}; pub use self::owner::{CrateOwner, Owner, OwnerKind}; pub use self::team::{NewTeam, Team}; pub use self::token::ApiToken; diff --git a/src/controllers/krate/metadata.rs b/src/controllers/krate/metadata.rs index f2416327718..1fe63a9e778 100644 --- a/src/controllers/krate/metadata.rs +++ b/src/controllers/krate/metadata.rs @@ -7,8 +7,8 @@ use crate::app::AppState; use crate::controllers::krate::CratePath; use crate::models::{ - Category, Crate, CrateCategory, CrateKeyword, Keyword, RecentCrateDownloads, TopVersions, User, - Version, VersionOwnerAction, + Category, Crate, CrateCategory, CrateKeyword, Keyword, TopVersions, User, Version, + VersionOwnerAction, }; use crate::schema::*; use crate::util::errors::{ @@ -294,7 +294,8 @@ fn load_recent_downloads<'a>( return always_ready(|| Ok(None)).boxed(); } - let fut = RecentCrateDownloads::belonging_to(&krate) + let fut = recent_crate_downloads::table + .filter(recent_crate_downloads::crate_id.eq(krate.id)) .select(recent_crate_downloads::downloads) .get_result(conn); async move { Ok(fut.await.optional()?) }.boxed() From f3dde1c4664ed33389538783e2f0970cb6e0e160 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 24 Jul 2025 07:28:11 +0200 Subject: [PATCH 2/2] controllers/krate: Simplify `load_recent_downloads()` signature --- src/controllers/krate/metadata.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controllers/krate/metadata.rs b/src/controllers/krate/metadata.rs index 1fe63a9e778..8132279bce8 100644 --- a/src/controllers/krate/metadata.rs +++ b/src/controllers/krate/metadata.rs @@ -136,7 +136,7 @@ pub async fn find_crate( ), load_keywords(&mut conn, &krate, include.keywords), load_categories(&mut conn, &krate, include.categories), - load_recent_downloads(&mut conn, &krate, include.downloads), + load_recent_downloads(&mut conn, krate.id, include.downloads), )?; let ids = versions_and_publishers @@ -285,17 +285,17 @@ fn load_categories<'a>( async move { Ok(Some(fut.await?)) }.boxed() } -fn load_recent_downloads<'a>( +fn load_recent_downloads( conn: &mut AsyncPgConnection, - krate: &'a Crate, + crate_id: i32, includes: bool, -) -> BoxFuture<'a, AppResult>> { +) -> BoxFuture<'_, AppResult>> { if !includes { return always_ready(|| Ok(None)).boxed(); } let fut = recent_crate_downloads::table - .filter(recent_crate_downloads::crate_id.eq(krate.id)) + .filter(recent_crate_downloads::crate_id.eq(crate_id)) .select(recent_crate_downloads::downloads) .get_result(conn); async move { Ok(fut.await.optional()?) }.boxed()