@@ -49,9 +49,7 @@ pub struct Release {
49
49
rustdoc_status : bool ,
50
50
pub ( crate ) build_time : DateTime < Utc > ,
51
51
stars : i32 ,
52
- yanked : bool ,
53
- is_latest_version : bool ,
54
- all_versions_yanked : Option < bool > ,
52
+ has_unyanked_releases : Option < bool > ,
55
53
}
56
54
57
55
#[ derive( Debug , Copy , Clone , PartialEq , Eq ) ]
@@ -92,9 +90,7 @@ pub(crate) async fn get_releases(
92
90
releases.target_name,
93
91
releases.rustdoc_status,
94
92
builds.build_time,
95
- repositories.stars,
96
- releases.yanked,
97
- crates.latest_version_id = releases.id AS \" is_latest_version!\"
93
+ repositories.stars
98
94
FROM crates
99
95
{1}
100
96
INNER JOIN builds ON releases.id = builds.rid
@@ -126,9 +122,7 @@ pub(crate) async fn get_releases(
126
122
rustdoc_status : row. get ( 4 ) ,
127
123
build_time : row. get ( 5 ) ,
128
124
stars : row. get :: < Option < i32 > , _ > ( 6 ) . unwrap_or ( 0 ) ,
129
- yanked : row. get ( 7 ) ,
130
- is_latest_version : row. get ( 8 ) ,
131
- all_versions_yanked : None ,
125
+ has_unyanked_releases : None ,
132
126
} )
133
127
. try_collect ( )
134
128
. await ?)
@@ -240,7 +234,7 @@ async fn get_search_results(
240
234
// So for now we are using the version with the youngest release_time.
241
235
// This is different from all other release-list views where we show
242
236
// our latest build.
243
- let crates: HashMap < String , Vec < Release > > = sqlx:: query!(
237
+ let crates: HashMap < String , Release > = sqlx:: query!(
244
238
r#"SELECT
245
239
crates.name,
246
240
releases.version,
@@ -249,53 +243,41 @@ async fn get_search_results(
249
243
releases.target_name,
250
244
releases.rustdoc_status,
251
245
repositories.stars as "stars?",
252
- releases.yanked,
253
- crates.latest_version_id = releases.id AS "is_latest_version!"
246
+ EXISTS (
247
+ SELECT 1
248
+ FROM releases AS all_releases
249
+ WHERE
250
+ all_releases.crate_id = crates.id AND
251
+ all_releases.yanked = false
252
+ ) AS has_unyanked_releases
254
253
255
254
FROM crates
256
- INNER JOIN releases ON crates.id = releases.crate_id
255
+ INNER JOIN releases ON crates.latest_version_id = releases.id
257
256
INNER JOIN builds ON releases.id = builds.rid
258
257
LEFT JOIN repositories ON releases.repository_id = repositories.id
259
258
260
259
WHERE crates.name = ANY($1)"# ,
261
260
& names[ ..] ,
262
261
)
263
262
. fetch ( & mut * conn)
264
- . try_fold ( HashMap :: new ( ) , |mut acc : HashMap < _ , Vec < _ > > , row| {
265
- acc. entry ( row. name . clone ( ) ) . or_default ( ) . push ( Release {
266
- name : row. name ,
267
- version : row. version ,
268
- description : row. description ,
269
- build_time : row. build_time ,
270
- target_name : Some ( row. target_name ) ,
271
- rustdoc_status : row. rustdoc_status ,
272
- stars : row. stars . unwrap_or ( 0 ) ,
273
- yanked : row. yanked ,
274
- is_latest_version : row. is_latest_version ,
275
- all_versions_yanked : None ,
276
- } ) ;
277
-
278
- async move { Ok ( acc) }
263
+ . map_ok ( |row| {
264
+ (
265
+ row. name . clone ( ) ,
266
+ Release {
267
+ name : row. name ,
268
+ version : row. version ,
269
+ description : row. description ,
270
+ build_time : row. build_time ,
271
+ target_name : Some ( row. target_name ) ,
272
+ rustdoc_status : row. rustdoc_status ,
273
+ stars : row. stars . unwrap_or ( 0 ) ,
274
+ has_unyanked_releases : row. has_unyanked_releases ,
275
+ } ,
276
+ )
279
277
} )
278
+ . try_collect ( )
280
279
. await ?;
281
280
282
- let crates: HashMap < String , Release > = crates
283
- . into_iter ( )
284
- . map ( |( name, releases) | {
285
- let mut release = releases
286
- . iter ( )
287
- . find ( |release| release. is_latest_version )
288
- . cloned ( )
289
- . unwrap_or ( releases[ 0 ] . clone ( ) ) ;
290
-
291
- if releases. iter ( ) . all ( |release| release. yanked ) {
292
- release. all_versions_yanked = Some ( true ) ;
293
- }
294
-
295
- ( name, release)
296
- } )
297
- . collect ( ) ;
298
-
299
281
Ok ( SearchResult {
300
282
// start with the original names from crates.io to keep the original ranking,
301
283
// extend with the release/build information from docs.rs
0 commit comments