@@ -274,13 +274,13 @@ fn get_search_results(
274
274
275
275
let statement = "
276
276
SELECT
277
- crates.name,
278
- releases.version,
279
- releases.description,
280
- releases.target_name,
281
- releases.release_time,
282
- releases.rustdoc_status,
283
- crates.github_stars,
277
+ crates.name AS name ,
278
+ releases.version AS version ,
279
+ releases.description AS description ,
280
+ releases.target_name AS target_name ,
281
+ releases.release_time AS release_time ,
282
+ releases.rustdoc_status AS rustdoc_status ,
283
+ crates.github_stars AS github_stars ,
284
284
COUNT(*) OVER() as total
285
285
FROM crates
286
286
INNER JOIN (
@@ -289,7 +289,7 @@ fn get_search_results(
289
289
SELECT
290
290
releases.id,
291
291
releases.crate_id,
292
- rank () OVER (PARTITION BY crate_id ORDER BY release_time DESC) as rank
292
+ RANK () OVER (PARTITION BY crate_id ORDER BY release_time DESC) as rank
293
293
FROM releases
294
294
WHERE releases.rustdoc_status AND NOT releases.yanked
295
295
) AS releases
@@ -299,19 +299,14 @@ fn get_search_results(
299
299
WHERE
300
300
((char_length($1)::float - levenshtein(crates.name, $1)::float) / char_length($1)::float) >= 0.65
301
301
OR crates.name ILIKE CONCAT('%', $1, '%')
302
- OR plainto_tsquery($1) @@ to_tsvector(releases.description)
303
302
GROUP BY crates.id, releases.id
304
303
ORDER BY
305
304
levenshtein(crates.name, $1) ASC,
306
305
crates.name ILIKE CONCAT('%', $1, '%'),
307
- ts_rank_cd(to_tsvector(releases.description), plainto_tsquery($1), 32) DESC,
308
306
releases.downloads DESC
309
307
LIMIT $2 OFFSET $3" ;
310
308
311
- let rows = if let Ok ( rows) = conn
312
- . query ( statement, & [ & query, & limit, & offset] )
313
- . map_err ( |err| dbg ! ( err) )
314
- {
309
+ let rows = if let Ok ( rows) = conn. query ( statement, & [ & query, & limit, & offset] ) {
315
310
rows
316
311
} else {
317
312
return ( 0 , Vec :: new ( ) ) ;
@@ -321,18 +316,18 @@ fn get_search_results(
321
316
let total_results = rows
322
317
. iter ( )
323
318
. next ( )
324
- . map ( |row| row. get :: < _ , i64 > ( 7 ) )
319
+ . map ( |row| row. get :: < _ , i64 > ( "total" ) )
325
320
. unwrap_or_default ( ) ;
326
321
let packages: Vec < Release > = rows
327
322
. into_iter ( )
328
323
. map ( |row| Release {
329
- name : row. get ( 0 ) ,
330
- version : row. get ( 1 ) ,
331
- description : row. get ( 2 ) ,
332
- target_name : row. get ( 3 ) ,
333
- release_time : row. get ( 4 ) ,
334
- rustdoc_status : row. get ( 5 ) ,
335
- stars : row. get :: < _ , i32 > ( 6 ) ,
324
+ name : row. get ( "name" ) ,
325
+ version : row. get ( "version" ) ,
326
+ description : row. get ( "description" ) ,
327
+ target_name : row. get ( "target_name" ) ,
328
+ release_time : row. get ( "release_time" ) ,
329
+ rustdoc_status : row. get ( "rustdoc_status" ) ,
330
+ stars : row. get :: < _ , i32 > ( "github_stars" ) ,
336
331
} )
337
332
. collect ( ) ;
338
333
@@ -804,29 +799,30 @@ mod tests {
804
799
} )
805
800
}
806
801
807
- #[ test]
808
- fn search_descriptions ( ) {
809
- wrapper ( |env| {
810
- let db = env. db ( ) ;
811
- db. fake_release ( )
812
- . name ( "something_completely_unrelated" )
813
- . description ( "Supercalifragilisticexpialidocious" )
814
- . create ( ) ?;
815
-
816
- let ( num_results, results) =
817
- get_search_results ( & db. conn ( ) , "supercalifragilisticexpialidocious" , 1 , 100 ) ;
818
- assert_eq ! ( num_results, 1 ) ;
819
-
820
- let mut results = results. into_iter ( ) ;
821
- assert_eq ! (
822
- results. next( ) . unwrap( ) . name,
823
- "something_completely_unrelated"
824
- ) ;
825
- assert_eq ! ( results. count( ) , 0 ) ;
826
-
827
- Ok ( ( ) )
828
- } )
829
- }
802
+ // Description searching more than doubles search time
803
+ // #[test]
804
+ // fn search_descriptions() {
805
+ // wrapper(|env| {
806
+ // let db = env.db();
807
+ // db.fake_release()
808
+ // .name("something_completely_unrelated")
809
+ // .description("Supercalifragilisticexpialidocious")
810
+ // .create()?;
811
+ //
812
+ // let (num_results, results) =
813
+ // get_search_results(&db.conn(), "supercalifragilisticexpialidocious", 1, 100);
814
+ // assert_eq!(num_results, 1);
815
+ //
816
+ // let mut results = results.into_iter();
817
+ // assert_eq!(
818
+ // results.next().unwrap().name,
819
+ // "something_completely_unrelated"
820
+ // );
821
+ // assert_eq!(results.count(), 0);
822
+ //
823
+ // Ok(())
824
+ // })
825
+ // }
830
826
831
827
#[ test]
832
828
fn search_limits ( ) {
@@ -921,44 +917,45 @@ mod tests {
921
917
} )
922
918
}
923
919
924
- #[ test]
925
- fn fuzzy_over_description ( ) {
926
- wrapper ( |env| {
927
- let db = env. db ( ) ;
928
- db. fake_release ( )
929
- . name ( "name_better_than_description" )
930
- . description ( "this is the correct choice" )
931
- . create ( ) ?;
932
- db. fake_release ( )
933
- . name ( "im_completely_unrelated" )
934
- . description ( "name_better_than_description" )
935
- . create ( ) ?;
936
- db. fake_release ( )
937
- . name ( "i_have_zero_relation_whatsoever" )
938
- . create ( ) ?;
939
-
940
- let ( num_results, results) =
941
- get_search_results ( & db. conn ( ) , "name_better_than_description" , 1 , 100 ) ;
942
- assert_eq ! ( num_results, 2 ) ;
943
-
944
- let mut results = results. into_iter ( ) ;
945
-
946
- let next = results. next ( ) . unwrap ( ) ;
947
- assert_eq ! ( next. name, "name_better_than_description" ) ;
948
- assert_eq ! ( next. description, Some ( "this is the correct choice" . into( ) ) ) ;
949
-
950
- let next = results. next ( ) . unwrap ( ) ;
951
- assert_eq ! ( next. name, "im_completely_unrelated" ) ;
952
- assert_eq ! (
953
- next. description,
954
- Some ( "name_better_than_description" . into( ) )
955
- ) ;
956
-
957
- assert_eq ! ( results. count( ) , 0 ) ;
958
-
959
- Ok ( ( ) )
960
- } )
961
- }
920
+ // Description searching more than doubles search time
921
+ // #[test]
922
+ // fn fuzzy_over_description() {
923
+ // wrapper(|env| {
924
+ // let db = env.db();
925
+ // db.fake_release()
926
+ // .name("name_better_than_description")
927
+ // .description("this is the correct choice")
928
+ // .create()?;
929
+ // db.fake_release()
930
+ // .name("im_completely_unrelated")
931
+ // .description("name_better_than_description")
932
+ // .create()?;
933
+ // db.fake_release()
934
+ // .name("i_have_zero_relation_whatsoever")
935
+ // .create()?;
936
+ //
937
+ // let (num_results, results) =
938
+ // get_search_results(&db.conn(), "name_better_than_description", 1, 100);
939
+ // assert_eq!(num_results, 2);
940
+ //
941
+ // let mut results = results.into_iter();
942
+ //
943
+ // let next = results.next().unwrap();
944
+ // assert_eq!(next.name, "name_better_than_description");
945
+ // assert_eq!(next.description, Some("this is the correct choice".into()));
946
+ //
947
+ // let next = results.next().unwrap();
948
+ // assert_eq!(next.name, "im_completely_unrelated");
949
+ // assert_eq!(
950
+ // next.description,
951
+ // Some("name_better_than_description".into())
952
+ // );
953
+ //
954
+ // assert_eq!(results.count(), 0);
955
+ //
956
+ // Ok(())
957
+ // })
958
+ // }
962
959
963
960
#[ test]
964
961
fn dont_return_unrelated ( ) {
0 commit comments