Skip to content

Commit 04c2a8e

Browse files
authored
controllers/summary: Read downloads from crate_downloads table (#8249)
1 parent a566d4a commit 04c2a8e

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

src/controllers/summary.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::app::AppState;
22
use crate::controllers::cargo_prelude::AppResult;
33
use crate::models::{Category, Crate, CrateVersions, Keyword, TopVersions, Version};
4-
use crate::schema::{crates, keywords, metadata, recent_crate_downloads};
4+
use crate::schema::{crate_downloads, crates, keywords, metadata, recent_crate_downloads};
55
use crate::tasks::spawn_blocking;
66
use crate::views::{EncodableCategory, EncodableCrate, EncodableKeyword};
77
use axum::Json;
@@ -21,45 +21,50 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
2121

2222
fn encode_crates(
2323
conn: &mut PgConnection,
24-
data: Vec<(Crate, Option<i64>)>,
24+
data: Vec<(Crate, i64, Option<i64>)>,
2525
) -> AppResult<Vec<EncodableCrate>> {
26-
let recent_downloads = data.iter().map(|&(_, s)| s).collect::<Vec<_>>();
26+
let downloads = data
27+
.iter()
28+
.map(|&(_, total, recent)| (total, recent))
29+
.collect::<Vec<_>>();
2730

28-
let krates = data.into_iter().map(|(c, _)| c).collect::<Vec<_>>();
31+
let krates = data.into_iter().map(|(c, _, _)| c).collect::<Vec<_>>();
2932

3033
let versions: Vec<Version> = krates.versions().load(conn)?;
3134
versions
3235
.grouped_by(&krates)
3336
.into_iter()
3437
.map(TopVersions::from_versions)
3538
.zip(krates)
36-
.zip(recent_downloads)
37-
.map(|((top_versions, krate), recent_downloads)| {
38-
let downloads = krate.downloads as i64;
39+
.zip(downloads)
40+
.map(|((top_versions, krate), (total, recent))| {
3941
Ok(EncodableCrate::from_minimal(
4042
krate,
4143
Some(&top_versions),
4244
None,
4345
false,
44-
downloads,
45-
recent_downloads,
46+
total,
47+
recent,
4648
))
4749
})
4850
.collect()
4951
}
5052

5153
let selection = (
5254
Crate::as_select(),
55+
crate_downloads::downloads,
5356
recent_crate_downloads::downloads.nullable(),
5457
);
5558

5659
let new_crates = crates::table
60+
.inner_join(crate_downloads::table)
5761
.left_join(recent_crate_downloads::table)
5862
.order(crates::created_at.desc())
5963
.select(selection)
6064
.limit(10)
6165
.load(conn)?;
6266
let just_updated = crates::table
67+
.inner_join(crate_downloads::table)
6368
.left_join(recent_crate_downloads::table)
6469
.filter(crates::updated_at.ne(crates::created_at))
6570
.order(crates::updated_at.desc())
@@ -68,19 +73,21 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
6873
.load(conn)?;
6974

7075
let mut most_downloaded_query = crates::table
76+
.inner_join(crate_downloads::table)
7177
.left_join(recent_crate_downloads::table)
7278
.into_boxed();
7379
if !config.excluded_crate_names.is_empty() {
7480
most_downloaded_query =
7581
most_downloaded_query.filter(crates::name.ne_all(&config.excluded_crate_names));
7682
}
7783
let most_downloaded = most_downloaded_query
78-
.then_order_by(crates::downloads.desc())
84+
.then_order_by(crate_downloads::downloads.desc())
7985
.select(selection)
8086
.limit(10)
8187
.load(conn)?;
8288

8389
let mut most_recently_downloaded_query = crates::table
90+
.inner_join(crate_downloads::table)
8491
.inner_join(recent_crate_downloads::table)
8592
.into_boxed();
8693
if !config.excluded_crate_names.is_empty() {

0 commit comments

Comments
 (0)