@@ -15,6 +15,7 @@ use axum_extra::response::ErasedJson;
1515use crates_io_diesel_helpers:: to_char;
1616use diesel:: prelude:: * ;
1717use diesel_async:: RunQueryDsl ;
18+ use futures_util:: FutureExt ;
1819use 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