Skip to content

Commit 15133c4

Browse files
authored
controllers/krate/downloads: Perform queries in parallel (#10577)
1 parent 7f64742 commit 15133c4

File tree

1 file changed

+24
-20
lines changed

1 file changed

+24
-20
lines changed

src/controllers/krate/downloads.rs

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use axum_extra::response::ErasedJson;
1515
use crates_io_diesel_helpers::to_char;
1616
use diesel::prelude::*;
1717
use diesel_async::RunQueryDsl;
18+
use futures_util::FutureExt;
1819
use std::cmp;
1920

2021
/// Get the download counts for a crate.
@@ -46,30 +47,33 @@ pub async fn get_crate_downloads(state: AppState, path: CratePath) -> AppResult<
4647
versions.sort_unstable_by(|a, b| b.num.cmp(&a.num));
4748
let (latest_five, rest) = versions.split_at(cmp::min(5, versions.len()));
4849

49-
let downloads = VersionDownload::belonging_to(latest_five)
50-
.filter(version_downloads::date.gt(date(now - 90.days())))
51-
.order((
52-
version_downloads::date.asc(),
53-
version_downloads::version_id.desc(),
54-
))
55-
.load(&mut conn)
56-
.await?
50+
let sum_downloads = sql::<BigInt>("SUM(version_downloads.downloads)");
51+
let (downloads, extra) = tokio::try_join!(
52+
VersionDownload::belonging_to(latest_five)
53+
.filter(version_downloads::date.gt(date(now - 90.days())))
54+
.order((
55+
version_downloads::date.asc(),
56+
version_downloads::version_id.desc(),
57+
))
58+
.load(&mut conn)
59+
.boxed(),
60+
VersionDownload::belonging_to(rest)
61+
.select((
62+
to_char(version_downloads::date, "YYYY-MM-DD"),
63+
sum_downloads,
64+
))
65+
.filter(version_downloads::date.gt(date(now - 90.days())))
66+
.group_by(version_downloads::date)
67+
.order(version_downloads::date.asc())
68+
.load::<ExtraDownload>(&mut conn)
69+
.boxed(),
70+
)?;
71+
72+
let downloads = downloads
5773
.into_iter()
5874
.map(VersionDownload::into)
5975
.collect::<Vec<EncodableVersionDownload>>();
6076

61-
let sum_downloads = sql::<BigInt>("SUM(version_downloads.downloads)");
62-
let extra: Vec<ExtraDownload> = VersionDownload::belonging_to(rest)
63-
.select((
64-
to_char(version_downloads::date, "YYYY-MM-DD"),
65-
sum_downloads,
66-
))
67-
.filter(version_downloads::date.gt(date(now - 90.days())))
68-
.group_by(version_downloads::date)
69-
.order(version_downloads::date.asc())
70-
.load(&mut conn)
71-
.await?;
72-
7377
#[derive(Serialize, Queryable)]
7478
struct ExtraDownload {
7579
date: String,

0 commit comments

Comments
 (0)