@@ -420,12 +420,12 @@ impl Crate {
420
420
Ok ( rows. iter ( ) . map ( |r| Model :: from_row ( & r) ) . collect ( ) )
421
421
}
422
422
423
- /// Returns (dependency, dependent crate name)
423
+ /// Returns (dependency, dependent crate name, dependent crate downloads )
424
424
pub fn reverse_dependencies ( & self ,
425
425
conn : & GenericConnection ,
426
426
offset : i64 ,
427
427
limit : i64 )
428
- -> CargoResult < ( Vec < ( Dependency , String ) > , i64 ) > {
428
+ -> CargoResult < ( Vec < ( Dependency , String , i32 ) > , i64 ) > {
429
429
let select_sql = "
430
430
FROM dependencies
431
431
INNER JOIN versions
@@ -435,21 +435,22 @@ impl Crate {
435
435
WHERE dependencies.crate_id = $1
436
436
AND versions.num = crates.max_version
437
437
" ;
438
- let fetch_sql = format ! ( "SELECT DISTINCT ON (crate_name)
438
+ let fetch_sql = format ! ( "SELECT DISTINCT ON (crate_downloads, crate_name)
439
439
dependencies.*,
440
+ crates.downloads AS crate_downloads,
440
441
crates.name AS crate_name
441
442
{}
442
- ORDER BY crate_name ASC
443
+ ORDER BY crate_downloads DESC
443
444
OFFSET $2
444
- LIMIT $3" , select_sql) ;
445
- let count_sql = format ! ( "SELECT COUNT(DISTINCT(crates.id)) {}" ,
445
+ LIMIT $3" ,
446
446
select_sql) ;
447
+ let count_sql = format ! ( "SELECT COUNT(DISTINCT(crates.id)) {}" , select_sql) ;
447
448
448
449
let stmt = try!( conn. prepare ( & fetch_sql) ) ;
449
450
let vec: Vec < _ > = try!( stmt. query ( & [ & self . id , & offset, & limit] ) )
450
- . iter ( ) . map ( |r| {
451
- ( Model :: from_row ( & r) , r. get ( "crate_name" ) )
452
- } ) . collect ( ) ;
451
+ . iter ( )
452
+ . map ( |r| ( Model :: from_row ( & r) , r. get ( "crate_name" ) , r . get ( "crate_downloads" ) ) )
453
+ . collect ( ) ;
453
454
let stmt = try!( conn. prepare ( & count_sql) ) ;
454
455
let cnt: i64 = try!( stmt. query ( & [ & self . id ] ) ) . iter ( ) . next ( ) . unwrap ( ) . get ( 0 ) ;
455
456
@@ -1185,12 +1186,11 @@ pub fn reverse_dependencies(req: &mut Request) -> CargoResult<Response> {
1185
1186
let name = & req. params ( ) [ "crate_id" ] ;
1186
1187
let conn = try!( req. tx ( ) ) ;
1187
1188
let krate = try!( Crate :: find_by_name ( conn, & name) ) ;
1188
- let tx = try!( req. tx ( ) ) ;
1189
1189
let ( offset, limit) = try!( req. pagination ( 10 , 100 ) ) ;
1190
- let ( rev_deps, total) = try!( krate. reverse_dependencies ( tx , offset, limit) ) ;
1191
- let rev_deps = rev_deps. into_iter ( ) . map ( | ( dep , crate_name ) | {
1192
- dep. encodable ( & crate_name)
1193
- } ) . collect ( ) ;
1190
+ let ( rev_deps, total) = try!( krate. reverse_dependencies ( conn , offset, limit) ) ;
1191
+ let rev_deps = rev_deps. into_iter ( )
1192
+ . map ( | ( dep, crate_name , downloads ) | dep . encodable ( & crate_name, Some ( downloads ) ) )
1193
+ . collect ( ) ;
1194
1194
1195
1195
#[ derive( RustcEncodable ) ]
1196
1196
struct R { dependencies : Vec < EncodableDependency > , meta : Meta }
0 commit comments