@@ -15,6 +15,7 @@ use axum_extra::response::ErasedJson;
15
15
use crates_io_diesel_helpers:: to_char;
16
16
use diesel:: prelude:: * ;
17
17
use diesel_async:: RunQueryDsl ;
18
+ use futures_util:: FutureExt ;
18
19
use std:: cmp;
19
20
20
21
/// Get the download counts for a crate.
@@ -46,30 +47,33 @@ pub async fn get_crate_downloads(state: AppState, path: CratePath) -> AppResult<
46
47
versions. sort_unstable_by ( |a, b| b. num . cmp ( & a. num ) ) ;
47
48
let ( latest_five, rest) = versions. split_at ( cmp:: min ( 5 , versions. len ( ) ) ) ;
48
49
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
57
73
. into_iter ( )
58
74
. map ( VersionDownload :: into)
59
75
. collect :: < Vec < EncodableVersionDownload > > ( ) ;
60
76
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
-
73
77
#[ derive( Serialize , Queryable ) ]
74
78
struct ExtraDownload {
75
79
date : String ,
0 commit comments