diff options
-rw-r--r-- | crate_db/src/lib_crate_db.rs | 10 | ||||
-rw-r--r-- | front_end/src/front_end.rs | 4 | ||||
-rw-r--r-- | front_end/src/home_page.rs | 4 | ||||
-rw-r--r-- | kitchen_sink/src/lib_kitchen_sink.rs | 8 |
4 files changed, 16 insertions, 10 deletions
diff --git a/crate_db/src/lib_crate_db.rs b/crate_db/src/lib_crate_db.rs index 857bbf5..a22c2f2 100644 --- a/crate_db/src/lib_crate_db.rs +++ b/crate_db/src/lib_crate_db.rs @@ -964,20 +964,22 @@ impl CrateDb { /// Newly added or updated crates in any category /// /// Returns `origin` strings - pub async fn recently_updated_crates(&self) -> FResult<Vec<Origin>> { + pub async fn recently_updated_crates(&self, limit: u32) -> FResult<Vec<(Origin, f64)>> { self.with_read("recently_updated_crates", |conn| { let mut query = conn.prepare_cached(r#" select max(created) + 3600*24*7 * k.ranking, -- week*rank ~= best this week + k.ranking, k.origin from crate_versions v join crates k on v.crate_id = k.id group by v.crate_id having count(*) > 1 -- so these are updates, not new releases order by 1 desc - limit 50 + limit ?1 "#)?; - let q = query.query_map(NO_PARAMS, |row| { - Ok(Origin::from_str(row.get_raw(1).as_str().unwrap())) + let q = query.query_map(&[&limit], |row| { + let origin = Origin::from_str(row.get_raw(2).as_str()?); + Ok((origin, row.get(1)?)) })?; let q = q.filter_map(|r| r.ok()); Ok(q.collect()) diff --git a/front_end/src/front_end.rs b/front_end/src/front_end.rs index 7a7de17..4148d48 100644 --- a/front_end/src/front_end.rs +++ b/front_end/src/front_end.rs @@ -174,12 +174,12 @@ pub struct CompatRange { } pub async fn render_trending_crates(out: &mut impl Write, kitchen_sink: &KitchenSink, renderer: &Renderer) -> Result<(), failure::Error> { - let (top, upd) = futures::join!(kitchen_sink.trending_crates(50), kitchen_sink.recently_updated_crates()); + let (top, upd) = futures::join!(kitchen_sink.trending_crates(50), kitchen_sink.notable_recently_updated_crates(70)); let upd = upd?; let mut seen = HashSet::new(); let mut tmp1 = Vec::with_capacity(upd.len()); - for k in upd.iter() { + for (k, _) in upd.iter() { if seen.insert(k) { let f1 = kitchen_sink.rich_crate_version_async(k); let f2 = kitchen_sink.rich_crate_async(k); diff --git a/front_end/src/home_page.rs b/front_end/src/home_page.rs index c9db922..0ac1612 100644 --- a/front_end/src/home_page.rs +++ b/front_end/src/home_page.rs @@ -196,10 +196,10 @@ impl<'a> HomePage<'a> { pub fn recently_updated_crates(&self) -> Vec<(RichCrate, Arc<RichCrateVersion>)> { self.block(async { futures::stream::iter(self.crates - .recently_updated_crates().await + .notable_recently_updated_crates(30).await .expect("recent crates") .into_iter()) - .filter_map(move |o| async move { + .filter_map(move |(o, _)| async move { futures::try_join!(self.crates.rich_crate_async(&o), self.crates.rich_crate_version_async(&o)).ok() }) .collect::<Vec<_>>().await diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs index ae33cfa..8877bdb 100644 --- a/kitchen_sink/src/lib_kitchen_sink.rs +++ b/kitchen_sink/src/lib_kitchen_sink.rs @@ -1983,12 +1983,16 @@ impl KitchenSink { keywords } + #[inline] pub async fn recently_updated_crates_in_category(&self, slug: &str) -> CResult<Vec<Origin>> { Ok(self.crate_db.recently_updated_crates_in_category(slug).await?) } - pub async fn recently_updated_crates(&self) -> CResult<Vec<Origin>> { - Ok(self.crate_db.recently_updated_crates().await?) + #[inline] + pub async fn notable_recently_updated_crates(&self, limit: u32) -> CResult<Vec<(Origin, f64)>> { + let mut crates = self.crate_db.recently_updated_crates(limit).await?; + self.knock_duplicates(&mut crates).await; + Ok(crates) } pub async fn category_crate_count(&self, slug: &str) -> Result<u32, KitchenSinkErr> { |