Skip to content

Commit 1c93a22

Browse files
authored
Merge pull request #9938 from Turbo87/async-rev-deps
controllers/krate/metadata: Migrate reverse dependencies endpoint to `diesel-async`
2 parents 6a5cf9f + 7e2892e commit 1c93a22

File tree

3 files changed

+64
-44
lines changed

3 files changed

+64
-44
lines changed

src/controllers/krate/metadata.rs

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -249,51 +249,55 @@ pub async fn reverse_dependencies(
249249
Path(name): Path<String>,
250250
req: Parts,
251251
) -> AppResult<Json<Value>> {
252-
let conn = app.db_read().await?;
253-
spawn_blocking(move || {
254-
use diesel::RunQueryDsl;
252+
use diesel_async::RunQueryDsl;
255253

256-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
254+
let mut conn = app.db_read().await?;
257255

258-
let pagination_options = PaginationOptions::builder().gather(&req)?;
256+
let pagination_options = PaginationOptions::builder().gather(&req)?;
259257

260-
let krate: Crate = Crate::by_name(&name)
261-
.first(conn)
262-
.optional()?
263-
.ok_or_else(|| crate_not_found(&name))?;
258+
let krate: Crate = Crate::by_name(&name)
259+
.first(&mut conn)
260+
.await
261+
.optional()?
262+
.ok_or_else(|| crate_not_found(&name))?;
264263

265-
let (rev_deps, total) = krate.reverse_dependencies(conn, pagination_options)?;
266-
let rev_deps: Vec<_> = rev_deps
267-
.into_iter()
268-
.map(|dep| EncodableDependency::from_reverse_dep(dep, &krate.name))
269-
.collect();
264+
let (rev_deps, total) = krate
265+
.reverse_dependencies(&mut conn, pagination_options)
266+
.await?;
270267

271-
let version_ids: Vec<i32> = rev_deps.iter().map(|dep| dep.version_id).collect();
268+
let rev_deps: Vec<_> = rev_deps
269+
.into_iter()
270+
.map(|dep| EncodableDependency::from_reverse_dep(dep, &krate.name))
271+
.collect();
272272

273-
let versions_and_publishers: Vec<(Version, CrateName, Option<User>)> = versions::table
274-
.filter(versions::id.eq_any(version_ids))
275-
.inner_join(crates::table)
276-
.left_outer_join(users::table)
277-
.select(<(Version, CrateName, Option<User>)>::as_select())
278-
.load(conn)?;
279-
let versions = versions_and_publishers
280-
.iter()
281-
.map(|(v, ..)| v)
282-
.collect::<Vec<_>>();
283-
let actions = VersionOwnerAction::for_versions(conn, &versions)?;
284-
let versions = versions_and_publishers
285-
.into_iter()
286-
.zip(actions)
287-
.map(|((version, krate_name, published_by), actions)| {
288-
EncodableVersion::from(version, &krate_name.name, published_by, actions)
289-
})
290-
.collect::<Vec<_>>();
273+
let version_ids: Vec<i32> = rev_deps.iter().map(|dep| dep.version_id).collect();
291274

292-
Ok(Json(json!({
293-
"dependencies": rev_deps,
294-
"versions": versions,
295-
"meta": { "total": total },
296-
})))
297-
})
298-
.await
275+
let versions_and_publishers: Vec<(Version, CrateName, Option<User>)> = versions::table
276+
.filter(versions::id.eq_any(version_ids))
277+
.inner_join(crates::table)
278+
.left_outer_join(users::table)
279+
.select(<(Version, CrateName, Option<User>)>::as_select())
280+
.load(&mut conn)
281+
.await?;
282+
283+
let versions = versions_and_publishers
284+
.iter()
285+
.map(|(v, ..)| v)
286+
.collect::<Vec<_>>();
287+
288+
let actions = VersionOwnerAction::async_for_versions(&mut conn, &versions).await?;
289+
290+
let versions = versions_and_publishers
291+
.into_iter()
292+
.zip(actions)
293+
.map(|((version, krate_name, published_by), actions)| {
294+
EncodableVersion::from(version, &krate_name.name, published_by, actions)
295+
})
296+
.collect::<Vec<_>>();
297+
298+
Ok(Json(json!({
299+
"dependencies": rev_deps,
300+
"versions": versions,
301+
"meta": { "total": total },
302+
})))
299303
}

src/models/action.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::sql::pg_enum;
44
use crate::util::diesel::prelude::*;
55
use crate::util::diesel::Conn;
66
use chrono::NaiveDateTime;
7+
use diesel_async::AsyncPgConnection;
78

89
pg_enum! {
910
pub enum VersionAction {
@@ -78,6 +79,20 @@ impl VersionOwnerAction {
7879
.load(conn)?
7980
.grouped_by(versions))
8081
}
82+
83+
pub async fn async_for_versions(
84+
conn: &mut AsyncPgConnection,
85+
versions: &[&Version],
86+
) -> QueryResult<Vec<Vec<(Self, User)>>> {
87+
use diesel_async::RunQueryDsl;
88+
89+
Ok(Self::belonging_to(versions)
90+
.inner_join(users::table)
91+
.order(version_owner_actions::dsl::id)
92+
.load(conn)
93+
.await?
94+
.grouped_by(versions))
95+
}
8196
}
8297

8398
pub fn insert_version_owner_action(

src/models/krate.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -464,22 +464,23 @@ impl Crate {
464464

465465
/// Returns (dependency, dependent crate name, dependent crate downloads)
466466
#[instrument(skip_all, fields(krate.name = %self.name))]
467-
pub(crate) fn reverse_dependencies(
467+
pub(crate) async fn reverse_dependencies(
468468
&self,
469-
conn: &mut impl Conn,
469+
conn: &mut AsyncPgConnection,
470470
options: PaginationOptions,
471471
) -> QueryResult<(Vec<ReverseDependency>, i64)> {
472472
use diesel::sql_query;
473473
use diesel::sql_types::{BigInt, Integer};
474-
use diesel::RunQueryDsl;
474+
use diesel_async::RunQueryDsl;
475475

476476
let offset = options.offset().unwrap_or_default();
477477
let rows: Vec<WithCount<ReverseDependency>> =
478478
sql_query(include_str!("krate_reverse_dependencies.sql"))
479479
.bind::<Integer, _>(self.id)
480480
.bind::<BigInt, _>(offset)
481481
.bind::<BigInt, _>(options.per_page)
482-
.load(conn)?;
482+
.load(conn)
483+
.await?;
483484

484485
Ok(rows.records_and_total())
485486
}

0 commit comments

Comments
 (0)