@@ -29,6 +29,7 @@ use download::{VersionDownload, EncodableVersionDownload};
29
29
use git;
30
30
use keyword:: { EncodableKeyword , CrateKeyword } ;
31
31
use owner:: { EncodableOwner , Owner , Rights , OwnerKind , Team , rights, CrateOwner } ;
32
+ use pagination:: Paginate ;
32
33
use schema:: * ;
33
34
use upload;
34
35
use user:: RequestUser ;
@@ -781,22 +782,16 @@ impl Model for Crate {
781
782
/// Handles the `GET /crates` route.
782
783
#[ allow( trivial_casts) ]
783
784
pub fn index ( req : & mut Request ) -> CargoResult < Response > {
784
- use diesel:: expression:: dsl :: sql ;
785
- use diesel:: types:: { BigInt , Bool } ;
785
+ use diesel:: expression:: AsExpression ;
786
+ use diesel:: types:: Bool ;
786
787
787
788
let conn = req. db_conn ( ) ?;
788
789
let ( offset, limit) = req. pagination ( 10 , 100 ) ?;
789
790
let params = req. query ( ) ;
790
791
let sort = params. get ( "sort" ) . map ( |s| & * * s) . unwrap_or ( "alpha" ) ;
791
792
792
793
let mut query = crates:: table
793
- . select ( (
794
- ALL_COLUMNS ,
795
- sql :: < BigInt > ( "COUNT(*) OVER ()" ) ,
796
- sql :: < Bool > ( "false" ) ,
797
- ) )
798
- . limit ( limit)
799
- . offset ( offset)
794
+ . select ( ( ALL_COLUMNS , AsExpression :: < Bool > :: as_expression ( false ) ) )
800
795
. into_boxed ( ) ;
801
796
802
797
if sort == "downloads" {
@@ -813,11 +808,7 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
813
808
) ,
814
809
) ) ;
815
810
816
- query = query. select ( (
817
- ALL_COLUMNS ,
818
- sql :: < BigInt > ( "COUNT(*) OVER()" ) ,
819
- crates:: name. eq ( q_string) ,
820
- ) ) ;
811
+ query = query. select ( ( ALL_COLUMNS , crates:: name. eq ( q_string) ) ) ;
821
812
let perfect_match = crates:: name. eq ( q_string) . desc ( ) ;
822
813
if sort == "downloads" {
823
814
query = query. order ( ( perfect_match, crates:: downloads. desc ( ) ) ) ;
@@ -887,12 +878,14 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
887
878
) ) ;
888
879
}
889
880
890
- let data = query. load :: < ( Crate , i64 , bool ) > ( & * conn) ?;
891
- let total = data. get ( 0 ) . map ( |& ( _, t, _) | t) . unwrap_or ( 0 ) ;
881
+ let data = query. paginate ( limit, offset) . load :: < ( ( Crate , bool ) , i64 ) > (
882
+ & * conn,
883
+ ) ?;
884
+ let total = data. first ( ) . map ( |& ( _, t) | t) . unwrap_or ( 0 ) ;
892
885
let crates = data. iter ( )
893
- . map ( |& ( ref c, _, _) | c. clone ( ) )
886
+ . map ( |& ( ( ref c, _) , _) | c. clone ( ) )
894
887
. collect :: < Vec < _ > > ( ) ;
895
- let perfect_matches = data. into_iter ( ) . map ( |( _, _ , b ) | b) . collect :: < Vec < _ > > ( ) ;
888
+ let perfect_matches = data. into_iter ( ) . map ( |( ( _, b ) , _ ) | b) . collect :: < Vec < _ > > ( ) ;
896
889
897
890
let versions = Version :: belonging_to ( & crates)
898
891
. load :: < Version > ( & * conn) ?
0 commit comments