summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crate_db/src/lib_crate_db.rs10
-rw-r--r--front_end/src/front_end.rs4
-rw-r--r--front_end/src/home_page.rs4
-rw-r--r--kitchen_sink/src/lib_kitchen_sink.rs8
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> {