1
1
use crate :: app:: AppState ;
2
2
use crate :: controllers:: cargo_prelude:: AppResult ;
3
3
use crate :: models:: { Category , Crate , CrateVersions , Keyword , TopVersions , Version } ;
4
- use crate :: schema:: { crates, keywords, metadata, recent_crate_downloads} ;
4
+ use crate :: schema:: { crate_downloads , crates, keywords, metadata, recent_crate_downloads} ;
5
5
use crate :: tasks:: spawn_blocking;
6
6
use crate :: views:: { EncodableCategory , EncodableCrate , EncodableKeyword } ;
7
7
use axum:: Json ;
@@ -21,45 +21,50 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
21
21
22
22
fn encode_crates (
23
23
conn : & mut PgConnection ,
24
- data : Vec < ( Crate , Option < i64 > ) > ,
24
+ data : Vec < ( Crate , i64 , Option < i64 > ) > ,
25
25
) -> AppResult < Vec < EncodableCrate > > {
26
- let recent_downloads = data. iter ( ) . map ( |& ( _, s) | s) . collect :: < Vec < _ > > ( ) ;
26
+ let downloads = data
27
+ . iter ( )
28
+ . map ( |& ( _, total, recent) | ( total, recent) )
29
+ . collect :: < Vec < _ > > ( ) ;
27
30
28
- let krates = data. into_iter ( ) . map ( |( c, _) | c) . collect :: < Vec < _ > > ( ) ;
31
+ let krates = data. into_iter ( ) . map ( |( c, _, _ ) | c) . collect :: < Vec < _ > > ( ) ;
29
32
30
33
let versions: Vec < Version > = krates. versions ( ) . load ( conn) ?;
31
34
versions
32
35
. grouped_by ( & krates)
33
36
. into_iter ( )
34
37
. map ( TopVersions :: from_versions)
35
38
. zip ( krates)
36
- . zip ( recent_downloads)
37
- . map ( |( ( top_versions, krate) , recent_downloads) | {
38
- let downloads = krate. downloads as i64 ;
39
+ . zip ( downloads)
40
+ . map ( |( ( top_versions, krate) , ( total, recent) ) | {
39
41
Ok ( EncodableCrate :: from_minimal (
40
42
krate,
41
43
Some ( & top_versions) ,
42
44
None ,
43
45
false ,
44
- downloads ,
45
- recent_downloads ,
46
+ total ,
47
+ recent ,
46
48
) )
47
49
} )
48
50
. collect ( )
49
51
}
50
52
51
53
let selection = (
52
54
Crate :: as_select ( ) ,
55
+ crate_downloads:: downloads,
53
56
recent_crate_downloads:: downloads. nullable ( ) ,
54
57
) ;
55
58
56
59
let new_crates = crates:: table
60
+ . inner_join ( crate_downloads:: table)
57
61
. left_join ( recent_crate_downloads:: table)
58
62
. order ( crates:: created_at. desc ( ) )
59
63
. select ( selection)
60
64
. limit ( 10 )
61
65
. load ( conn) ?;
62
66
let just_updated = crates:: table
67
+ . inner_join ( crate_downloads:: table)
63
68
. left_join ( recent_crate_downloads:: table)
64
69
. filter ( crates:: updated_at. ne ( crates:: created_at) )
65
70
. order ( crates:: updated_at. desc ( ) )
@@ -68,19 +73,21 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
68
73
. load ( conn) ?;
69
74
70
75
let mut most_downloaded_query = crates:: table
76
+ . inner_join ( crate_downloads:: table)
71
77
. left_join ( recent_crate_downloads:: table)
72
78
. into_boxed ( ) ;
73
79
if !config. excluded_crate_names . is_empty ( ) {
74
80
most_downloaded_query =
75
81
most_downloaded_query. filter ( crates:: name. ne_all ( & config. excluded_crate_names ) ) ;
76
82
}
77
83
let most_downloaded = most_downloaded_query
78
- . then_order_by ( crates :: downloads. desc ( ) )
84
+ . then_order_by ( crate_downloads :: downloads. desc ( ) )
79
85
. select ( selection)
80
86
. limit ( 10 )
81
87
. load ( conn) ?;
82
88
83
89
let mut most_recently_downloaded_query = crates:: table
90
+ . inner_join ( crate_downloads:: table)
84
91
. inner_join ( recent_crate_downloads:: table)
85
92
. into_boxed ( ) ;
86
93
if !config. excluded_crate_names . is_empty ( ) {
0 commit comments