Skip to content

Commit 1ae716e

Browse files
committed
Add query to display recent_downloads on krates::show
Additionally, we've updated the join for this data on krate::index to use the new public API Diesel added for this in the most recent version, and made sure that any other endpoints which *don't* include this data are returning NULL instead of 0
1 parent 9c8947c commit 1ae716e

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

src/krate.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,6 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
573573
use diesel::types::{Bool, BigInt, Nullable};
574574
use diesel::expression::functions::date_and_time::{now, date};
575575
use diesel::expression::sql_literal::sql;
576-
use diesel::query_source::joins::LeftOuter;
577576

578577
let conn = req.db_conn()?;
579578
let (offset, limit) = req.pagination(10, 100)?;
@@ -585,12 +584,12 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
585584
let recent_downloads = sql::<Nullable<BigInt>>("SUM(crate_downloads.downloads)");
586585

587586
let mut query = crates::table
588-
.join(
589-
crate_downloads::table,
590-
LeftOuter,
591-
crates::id.eq(crate_downloads::crate_id).and(
592-
crate_downloads::date.gt(date(now - 90.days())),
593-
),
587+
.left_join(
588+
crate_downloads::table.on(
589+
crates::id.eq(crate_downloads::crate_id).and(
590+
crate_downloads::date.gt(date(now - 90.days())),
591+
)
592+
)
594593
)
595594
.group_by(crates::id)
596595
.select((
@@ -775,7 +774,7 @@ pub fn summary(req: &mut Request) -> CargoResult<Response> {
775774
.map(|versions| Version::max(versions.into_iter().map(|v| v.num)))
776775
.zip(krates)
777776
.map(|(max_version, krate)| {
778-
Ok(krate.minimal_encodable(max_version, None, false, Some(0)))
777+
Ok(krate.minimal_encodable(max_version, None, false, None))
779778
})
780779
.collect()
781780
};
@@ -833,6 +832,8 @@ pub fn summary(req: &mut Request) -> CargoResult<Response> {
833832

834833
/// Handles the `GET /crates/:crate_id` route.
835834
pub fn show(req: &mut Request) -> CargoResult<Response> {
835+
use diesel::expression::dsl::*;
836+
836837
let name = &req.params()["crate_id"];
837838
let conn = req.db_conn()?;
838839
let krate = Crate::by_name(name).first::<Crate>(&*conn)?;
@@ -849,6 +850,10 @@ pub fn show(req: &mut Request) -> CargoResult<Response> {
849850
.inner_join(categories::table)
850851
.select(categories::all_columns)
851852
.load(&*conn)?;
853+
let recent_downloads = CrateDownload::belonging_to(&krate)
854+
.filter(crate_downloads::date.gt(date(now - 90.days())))
855+
.select(sum(crate_downloads::downloads))
856+
.get_result(&*conn)?;
852857

853858
let badges = badges::table.filter(badges::crate_id.eq(krate.id)).load(
854859
&*conn,
@@ -872,7 +877,7 @@ pub fn show(req: &mut Request) -> CargoResult<Response> {
872877
Some(&cats),
873878
Some(badges),
874879
false,
875-
Some(0),
880+
recent_downloads,
876881
),
877882
versions: versions
878883
.into_iter()
@@ -1037,7 +1042,7 @@ pub fn new(req: &mut Request) -> CargoResult<Response> {
10371042
warnings: Warnings<'a>,
10381043
}
10391044
Ok(req.json(&R {
1040-
krate: krate.minimal_encodable(max_version, None, false, Some(0)),
1045+
krate: krate.minimal_encodable(max_version, None, false, None),
10411046
warnings: warnings,
10421047
}))
10431048
})

src/tests/krate.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ fn show() {
404404
.version(::VersionBuilder::new("0.5.0"))
405405
.version(::VersionBuilder::new("0.5.1"))
406406
.keyword("kw1")
407+
.downloads(20)
408+
.recent_downloads(10)
407409
.expect_build(&conn);
408410
}
409411

@@ -415,6 +417,7 @@ fn show() {
415417
assert_eq!(json.krate.homepage, krate.homepage);
416418
assert_eq!(json.krate.documentation, krate.documentation);
417419
assert_eq!(json.krate.keywords, Some(vec!["kw1".into()]));
420+
assert_eq!(json.krate.recent_downloads, Some(10));
418421
let versions = json.krate.versions.as_ref().unwrap();
419422
assert_eq!(versions.len(), 3);
420423
assert_eq!(json.versions.len(), 3);

0 commit comments

Comments
 (0)