Skip to content

Commit dc9bdd5

Browse files
committed
Auto merge of #2452 - Turbo87:recent-download, r=jtgeibel
summary: Fill `recent_downloads` fields This will allow us to show something like "3,442 downloads in the past 90 days" in the "Recent Downloads" list on the frontpage. r? @jtgeibel
2 parents 7cdddbf + 375c058 commit dc9bdd5

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

src/controllers/krate/metadata.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,40 +27,50 @@ pub fn summary(req: &mut dyn RequestExt) -> EndpointResult {
2727
.select(metadata::total_downloads)
2828
.get_result(&*conn)?;
2929

30-
let encode_crates = |krates: Vec<Crate>| -> AppResult<Vec<_>> {
30+
let encode_crates = |data: Vec<(Crate, Option<i64>)>| -> AppResult<Vec<_>> {
31+
let recent_downloads = data.iter().map(|&(_, s)| s).collect::<Vec<_>>();
32+
33+
let krates = data.into_iter().map(|(c, _)| c).collect::<Vec<_>>();
34+
3135
let versions = krates.versions().load::<Version>(&*conn)?;
3236
versions
3337
.grouped_by(&krates)
3438
.into_iter()
3539
.map(|versions| Version::top(versions.into_iter().map(|v| (v.created_at, v.num))))
3640
.zip(krates)
37-
.map(|(top_versions, krate)| {
38-
Ok(krate.minimal_encodable(&top_versions, None, false, None))
41+
.zip(recent_downloads)
42+
.map(|((top_versions, krate), recent_downloads)| {
43+
Ok(krate.minimal_encodable(&top_versions, None, false, recent_downloads))
3944
})
4045
.collect()
4146
};
4247

48+
let selection = (ALL_COLUMNS, recent_crate_downloads::downloads.nullable());
49+
4350
let new_crates = crates
51+
.left_join(recent_crate_downloads::table)
4452
.order(created_at.desc())
45-
.select(ALL_COLUMNS)
53+
.select(selection)
4654
.limit(10)
4755
.load(&*conn)?;
4856
let just_updated = crates
57+
.left_join(recent_crate_downloads::table)
4958
.filter(updated_at.ne(created_at))
5059
.order(updated_at.desc())
51-
.select(ALL_COLUMNS)
60+
.select(selection)
5261
.limit(10)
5362
.load(&*conn)?;
5463
let most_downloaded = crates
55-
.order(downloads.desc())
56-
.select(ALL_COLUMNS)
64+
.left_join(recent_crate_downloads::table)
65+
.then_order_by(downloads.desc())
66+
.select(selection)
5767
.limit(10)
5868
.load(&*conn)?;
5969

6070
let most_recently_downloaded = crates
6171
.inner_join(recent_crate_downloads::table)
62-
.order(recent_crate_downloads::downloads.desc())
63-
.select(ALL_COLUMNS)
72+
.then_order_by(recent_crate_downloads::downloads.desc())
73+
.select(selection)
6474
.limit(10)
6575
.load(&*conn)?;
6676

src/tests/krate.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,10 +1387,13 @@ fn summary_new_crates() {
13871387
assert_eq!(json.num_crates, 5);
13881388
assert_eq!(json.num_downloads, 6000);
13891389
assert_eq!(json.most_downloaded[0].name, "most_recent_downloads");
1390+
assert_eq!(json.most_downloaded[0].downloads, 5000);
1391+
assert_eq!(json.most_downloaded[0].recent_downloads, Some(50));
13901392
assert_eq!(
13911393
json.most_recently_downloaded[0].name,
13921394
"most_recent_downloads"
13931395
);
1396+
assert_eq!(json.most_recently_downloaded[0].recent_downloads, Some(50));
13941397
assert_eq!(json.popular_keywords[0].keyword, "popular");
13951398
assert_eq!(json.popular_categories[0].category, "Category 1");
13961399
assert_eq!(json.just_updated.len(), 2);

0 commit comments

Comments
 (0)