From 8f731106364bf828747af7e6177cc447a69a56d9 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 28 Apr 2024 22:59:20 +0200 Subject: show leaderboard --- src/state.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/state.rs') diff --git a/src/state.rs b/src/state.rs index ff5509b..9ad2f9a 100644 --- a/src/state.rs +++ b/src/state.rs @@ -76,6 +76,40 @@ impl Logic { state } + pub async fn get_leaderboard(&self) -> anyhow::Result> { + let txn = self.database.begin_read()?; + let mut d = { + let raw = txn.open_table(T_IMPRESSIONS_RAW)?; + let weighted = txn.open_table(T_IMPRESSIONS_WEIGHTED)?; + + weighted.iter()?.try_fold(Vec::new(), |mut s, k| { + let (k, v) = k?; + s.push(( + k.value().to_owned(), + raw.get(k.value())?.map(|e| e.value()).unwrap_or_default(), + v.value(), + )); + Ok::<_, anyhow::Error>(s) + })? + }; + + #[derive(PartialEq, PartialOrd)] + struct OrdAnyway(f64); + impl Eq for OrdAnyway {} + impl Ord for OrdAnyway { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.partial_cmp(other).unwrap() + } + } + + d.sort_by_key(|(_, _, w)| OrdAnyway(*w)); + while d.len() > 16 { + d.pop(); + } + + Ok(d) + } + async fn commit_db(&self, mut rx: Receiver) -> anyhow::Result<()> { let mut deadline = None; let mut impressions_by_addr = vec![0u16; self.config.bloom_filter_size]; -- cgit v1.2.3-70-g09d2