From bf00f968dee0c679767a3990f2c19c0ecca62de1 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Tue, 11 Feb 2025 15:05:26 -0800 Subject: [PATCH 01/10] feat: add competition ranking to leaderboard --- Cargo.lock | 4 +- Cargo.toml | 2 +- src/leaderboard/leaderboard_resource.rs | 11 ++++ src/leaderboard/messages/data/delete.rs | 1 - .../messages/data/fetch_by_rank.rs | 1 - .../messages/data/fetch_by_score.rs | 1 - .../messages/data/get_competition_rank.rs | 64 +++++++++++++++++++ src/leaderboard/messages/data/get_rank.rs | 1 - src/leaderboard/messages/data/length.rs | 1 - src/leaderboard/messages/data/mod.rs | 1 + .../messages/data/remove_elements.rs | 1 - src/leaderboard/messages/data/upsert.rs | 1 - 12 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 src/leaderboard/messages/data/get_competition_rank.rs diff --git a/Cargo.lock b/Cargo.lock index 3413b2a..b0182a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -669,9 +669,9 @@ dependencies = [ [[package]] name = "momento-protos" -version = "0.120.0" +version = "0.122.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4213df712c988787f748b35e40f40a7e3cba7a7b327c48f7d8da42354aebb9fa" +checksum = "f4fcecfc2e01f759d1ac0d2f80969f8b6ccdfafe2bc874a968fb587d70627b4f" dependencies = [ "prost", "tonic", diff --git a/Cargo.toml b/Cargo.toml index f22b974..684c51d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ doc = false [dependencies] -momento-protos = { version = "0.120.0" } +momento-protos = { version = "0.122.1" } log = "0.4" hyper = { version = "0.14" } h2 = { version = "0.3" } diff --git a/src/leaderboard/leaderboard_resource.rs b/src/leaderboard/leaderboard_resource.rs index 5dcbc5c..91fb122 100644 --- a/src/leaderboard/leaderboard_resource.rs +++ b/src/leaderboard/leaderboard_resource.rs @@ -4,6 +4,9 @@ use crate::leaderboard::messages::data::delete::{DeleteRequest, DeleteResponse}; use crate::leaderboard::messages::data::fetch::FetchResponse; use crate::leaderboard::messages::data::fetch_by_rank::{FetchByRankRequest, RankRange}; use crate::leaderboard::messages::data::fetch_by_score::{FetchByScoreRequest, ScoreRange}; +use crate::leaderboard::messages::data::get_competition_rank::{ + GetCompetitionRankRequest, GetCompetitionRankResponse, +}; use crate::leaderboard::messages::data::get_rank::{GetRankRequest, GetRankResponse}; use crate::leaderboard::messages::data::length::{LengthRequest, LengthResponse}; use crate::leaderboard::messages::data::remove_elements::{ @@ -103,6 +106,14 @@ impl Leaderboard { request.send(self).await } + pub async fn get_competition_rank( + &self, + ids: impl IntoIterator, + ) -> MomentoResult { + let request = GetCompetitionRankRequest::new(ids); + request.send(self).await + } + /* helper fns */ pub(crate) fn new( data_clients: Vec< diff --git a/src/leaderboard/messages/data/delete.rs b/src/leaderboard/messages/data/delete.rs index 87698d1..366685c 100644 --- a/src/leaderboard/messages/data/delete.rs +++ b/src/leaderboard/messages/data/delete.rs @@ -27,7 +27,6 @@ impl LeaderboardRequest for DeleteRequest { cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::DeleteLeaderboardRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), }, )?; diff --git a/src/leaderboard/messages/data/fetch_by_rank.rs b/src/leaderboard/messages/data/fetch_by_rank.rs index 6a3b4a8..5e1d882 100644 --- a/src/leaderboard/messages/data/fetch_by_rank.rs +++ b/src/leaderboard/messages/data/fetch_by_rank.rs @@ -101,7 +101,6 @@ impl LeaderboardRequest for FetchByRankRequest { cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::GetByRankRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), rank_range: Some(self.rank_range.into()), order: self.order.into_proto() as i32, diff --git a/src/leaderboard/messages/data/fetch_by_score.rs b/src/leaderboard/messages/data/fetch_by_score.rs index 4064249..6cb846e 100644 --- a/src/leaderboard/messages/data/fetch_by_score.rs +++ b/src/leaderboard/messages/data/fetch_by_score.rs @@ -145,7 +145,6 @@ impl LeaderboardRequest for FetchByScoreRequest { cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::GetByScoreRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), score_range: Some(self.score_range.into()), offset: self.offset.unwrap_or(0), diff --git a/src/leaderboard/messages/data/get_competition_rank.rs b/src/leaderboard/messages/data/get_competition_rank.rs new file mode 100644 index 0000000..631462a --- /dev/null +++ b/src/leaderboard/messages/data/get_competition_rank.rs @@ -0,0 +1,64 @@ +use super::{Order, RankedElement}; +use crate::leaderboard::LeaderboardRequest; +use crate::utils::prep_leaderboard_request_with_timeout; +use crate::{Leaderboard, MomentoResult}; + +pub struct GetCompetitionRankRequest { + ids: Vec, + order: Order, +} + +impl GetCompetitionRankRequest { + pub fn new(ids: impl IntoIterator) -> Self { + Self { + ids: ids.into_iter().collect(), + order: Order::Descending, + } + } + + pub fn order(mut self, order: Order) -> Self { + self.order = order; + self + } +} + +impl LeaderboardRequest for GetCompetitionRankRequest { + type Response = GetCompetitionRankResponse; + + async fn send(self, leaderboard: &Leaderboard) -> MomentoResult { + let cache_name = leaderboard.cache_name(); + let request = prep_leaderboard_request_with_timeout( + cache_name, + leaderboard.client_timeout(), + momento_protos::leaderboard::GetCompetitionRankRequest { + leaderboard: leaderboard.leaderboard_name().to_string(), + ids: self.ids, + order: Some(self.order.into_proto() as i32), + }, + )?; + + let response = leaderboard + .next_data_client() + .get_competition_rank(request) + .await? + .into_inner(); + + Ok(Self::Response { + elements: response.elements.iter().map(|v| v.into()).collect(), + }) + } +} + +pub struct GetCompetitionRankResponse { + elements: Vec, +} + +impl GetCompetitionRankResponse { + pub fn elements(&self) -> &[RankedElement] { + &self.elements + } + + pub fn into_elements(self) -> Vec { + self.elements + } +} \ No newline at end of file diff --git a/src/leaderboard/messages/data/get_rank.rs b/src/leaderboard/messages/data/get_rank.rs index c93a8bb..414d48d 100644 --- a/src/leaderboard/messages/data/get_rank.rs +++ b/src/leaderboard/messages/data/get_rank.rs @@ -39,7 +39,6 @@ impl LeaderboardRequest for GetRankRequest { cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::GetRankRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), ids: self.ids, order: self.order.into_proto() as i32, diff --git a/src/leaderboard/messages/data/length.rs b/src/leaderboard/messages/data/length.rs index 805cd8c..153ca8b 100644 --- a/src/leaderboard/messages/data/length.rs +++ b/src/leaderboard/messages/data/length.rs @@ -27,7 +27,6 @@ impl LeaderboardRequest for LengthRequest { cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::GetLeaderboardLengthRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), }, )?; diff --git a/src/leaderboard/messages/data/mod.rs b/src/leaderboard/messages/data/mod.rs index f9474cf..a951daa 100644 --- a/src/leaderboard/messages/data/mod.rs +++ b/src/leaderboard/messages/data/mod.rs @@ -9,6 +9,7 @@ pub mod fetch_by_rank; /// Contains the request and response types for requesting elements from a /// leaderboard by score. pub mod fetch_by_score; +pub mod get_competition_rank; /// Contains the request and response types for requesting elements from a /// leaderboard using their element ids. pub mod get_rank; diff --git a/src/leaderboard/messages/data/remove_elements.rs b/src/leaderboard/messages/data/remove_elements.rs index b25416f..4e35c40 100644 --- a/src/leaderboard/messages/data/remove_elements.rs +++ b/src/leaderboard/messages/data/remove_elements.rs @@ -26,7 +26,6 @@ impl LeaderboardRequest for RemoveElementsRequest { cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::RemoveElementsRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), ids: self.ids, }, diff --git a/src/leaderboard/messages/data/upsert.rs b/src/leaderboard/messages/data/upsert.rs index 76152e6..93d186e 100644 --- a/src/leaderboard/messages/data/upsert.rs +++ b/src/leaderboard/messages/data/upsert.rs @@ -61,7 +61,6 @@ where cache_name, leaderboard.client_timeout(), momento_protos::leaderboard::UpsertElementsRequest { - cache_name: cache_name.to_string(), leaderboard: leaderboard.leaderboard_name().to_string(), elements: self .elements From 4a182ffe3533a2488437c770636cd7d27278ef51 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 11:41:52 -0800 Subject: [PATCH 02/10] use fetch response --- src/leaderboard/leaderboard_resource.rs | 15 +++--- .../messages/data/get_competition_rank.rs | 34 ++++---------- src/leaderboard/messages/data/get_rank.rs | 28 +++-------- src/leaderboard/mod.rs | 2 +- tests/leaderboard/mod.rs | 47 +++++++++++++++++++ 5 files changed, 70 insertions(+), 56 deletions(-) diff --git a/src/leaderboard/leaderboard_resource.rs b/src/leaderboard/leaderboard_resource.rs index 91fb122..ea04016 100644 --- a/src/leaderboard/leaderboard_resource.rs +++ b/src/leaderboard/leaderboard_resource.rs @@ -4,10 +4,8 @@ use crate::leaderboard::messages::data::delete::{DeleteRequest, DeleteResponse}; use crate::leaderboard::messages::data::fetch::FetchResponse; use crate::leaderboard::messages::data::fetch_by_rank::{FetchByRankRequest, RankRange}; use crate::leaderboard::messages::data::fetch_by_score::{FetchByScoreRequest, ScoreRange}; -use crate::leaderboard::messages::data::get_competition_rank::{ - GetCompetitionRankRequest, GetCompetitionRankResponse, -}; -use crate::leaderboard::messages::data::get_rank::{GetRankRequest, GetRankResponse}; +use crate::leaderboard::messages::data::get_competition_rank::GetCompetitionRankRequest; +use crate::leaderboard::messages::data::get_rank::GetRankRequest; use crate::leaderboard::messages::data::length::{LengthRequest, LengthResponse}; use crate::leaderboard::messages::data::remove_elements::{ RemoveElementsRequest, RemoveElementsResponse, @@ -23,6 +21,8 @@ use tonic::transport::Channel; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::Duration; +use super::Order; + static NEXT_DATA_CLIENT_INDEX: AtomicUsize = AtomicUsize::new(0); /// Represents a remote leaderboard resource. @@ -83,7 +83,7 @@ impl Leaderboard { pub async fn get_rank( &self, ids: impl IntoIterator, - ) -> MomentoResult { + ) -> MomentoResult { let request = GetRankRequest::new(ids); request.send(self).await } @@ -109,8 +109,9 @@ impl Leaderboard { pub async fn get_competition_rank( &self, ids: impl IntoIterator, - ) -> MomentoResult { - let request = GetCompetitionRankRequest::new(ids); + rank: Option, + ) -> MomentoResult { + let request = GetCompetitionRankRequest::new(ids, rank); request.send(self).await } diff --git a/src/leaderboard/messages/data/get_competition_rank.rs b/src/leaderboard/messages/data/get_competition_rank.rs index 631462a..edb10ef 100644 --- a/src/leaderboard/messages/data/get_competition_rank.rs +++ b/src/leaderboard/messages/data/get_competition_rank.rs @@ -1,4 +1,5 @@ -use super::{Order, RankedElement}; +use super::fetch::FetchResponse; +use super::Order; use crate::leaderboard::LeaderboardRequest; use crate::utils::prep_leaderboard_request_with_timeout; use crate::{Leaderboard, MomentoResult}; @@ -9,21 +10,16 @@ pub struct GetCompetitionRankRequest { } impl GetCompetitionRankRequest { - pub fn new(ids: impl IntoIterator) -> Self { + pub fn new(ids: impl IntoIterator, order: Option) -> Self { Self { ids: ids.into_iter().collect(), - order: Order::Descending, + order: order.unwrap_or(Order::Descending), } } - - pub fn order(mut self, order: Order) -> Self { - self.order = order; - self - } } impl LeaderboardRequest for GetCompetitionRankRequest { - type Response = GetCompetitionRankResponse; + type Response = FetchResponse; async fn send(self, leaderboard: &Leaderboard) -> MomentoResult { let cache_name = leaderboard.cache_name(); @@ -43,22 +39,8 @@ impl LeaderboardRequest for GetCompetitionRankRequest { .await? .into_inner(); - Ok(Self::Response { - elements: response.elements.iter().map(|v| v.into()).collect(), - }) + Ok(FetchResponse::new( + response.elements.iter().map(|v| v.into()).collect(), + )) } } - -pub struct GetCompetitionRankResponse { - elements: Vec, -} - -impl GetCompetitionRankResponse { - pub fn elements(&self) -> &[RankedElement] { - &self.elements - } - - pub fn into_elements(self) -> Vec { - self.elements - } -} \ No newline at end of file diff --git a/src/leaderboard/messages/data/get_rank.rs b/src/leaderboard/messages/data/get_rank.rs index 414d48d..c3bbd3d 100644 --- a/src/leaderboard/messages/data/get_rank.rs +++ b/src/leaderboard/messages/data/get_rank.rs @@ -1,4 +1,5 @@ -use super::{Order, RankedElement}; +use super::fetch::FetchResponse; +use super::Order; use crate::leaderboard::LeaderboardRequest; use crate::utils::prep_leaderboard_request_with_timeout; use crate::{Leaderboard, MomentoResult}; @@ -31,7 +32,7 @@ impl GetRankRequest { } impl LeaderboardRequest for GetRankRequest { - type Response = GetRankResponse; + type Response = FetchResponse; async fn send(self, leaderboard: &Leaderboard) -> MomentoResult { let cache_name = leaderboard.cache_name(); @@ -51,25 +52,8 @@ impl LeaderboardRequest for GetRankRequest { .await? .into_inner(); - Ok(Self::Response { - elements: response.elements.iter().map(|v| v.into()).collect(), - }) - } -} - -/// The response type for a successful `GetRankRequest` -pub struct GetRankResponse { - elements: Vec, -} - -impl GetRankResponse { - /// Returns the ranked elements in the response. - pub fn elements(&self) -> &[RankedElement] { - &self.elements - } - - /// Consumes the response and returns the ranked elements. - pub fn into_elements(self) -> Vec { - self.elements + Ok(FetchResponse::new( + response.elements.iter().map(|v| v.into()).collect(), + )) } } diff --git a/src/leaderboard/mod.rs b/src/leaderboard/mod.rs index ecdd56b..3fc4c94 100644 --- a/src/leaderboard/mod.rs +++ b/src/leaderboard/mod.rs @@ -6,7 +6,7 @@ pub use messages::LeaderboardRequest; pub use messages::data::delete::{DeleteRequest, DeleteResponse}; pub use messages::data::fetch_by_rank::{FetchByRankRequest, RankRange}; pub use messages::data::fetch_by_score::{FetchByScoreRequest, ScoreRange}; -pub use messages::data::get_rank::{GetRankRequest, GetRankResponse}; +pub use messages::data::get_rank::GetRankRequest; pub use messages::data::length::{LengthRequest, LengthResponse}; pub use messages::data::remove_elements::{RemoveElementsRequest, RemoveElementsResponse}; pub use messages::data::upsert::{Element, UpsertRequest, UpsertResponse}; diff --git a/tests/leaderboard/mod.rs b/tests/leaderboard/mod.rs index de99e05..c016de1 100644 --- a/tests/leaderboard/mod.rs +++ b/tests/leaderboard/mod.rs @@ -350,3 +350,50 @@ mod fetch_by_score { Ok(()) } } + +mod get_competition_rank { + use momento::leaderboard::GetRankRequest; + + use super::*; + + #[tokio::test] + async fn get_competition_rank_of_elements() -> MomentoResult<()> { + let leaderboard = unique_leaderboard(); + let test_leaderboard = TestLeaderboard::new(); + leaderboard.upsert(test_leaderboard.elements()).await?; + + let response = leaderboard.get_rank(test_leaderboard.ids()).await?; + + assert_eq!( + test_leaderboard.ranked_elements(), + response.elements(), + "Expected the leaderboard to contain the elements that were upserted" + ); + Ok(()) + } + + #[tokio::test] + async fn get_rank_of_elements_asc() -> MomentoResult<()> { + let leaderboard = unique_leaderboard(); + let test_leaderboard = TestLeaderboard::new(); + leaderboard.upsert(test_leaderboard.elements()).await?; + + let response = leaderboard + .send_request(GetRankRequest::new(test_leaderboard.ids()).order(Order::Ascending)) + .await?; + + let mut ranked_elements = test_leaderboard.ranked_elements(); + let num_elements = ranked_elements.len(); + // adjust ranks + for (i, e) in ranked_elements.iter_mut().enumerate() { + e.rank = (num_elements - i - 1) as u32; + } + + assert_eq!( + ranked_elements, + response.elements(), + "Expected the leaderboard to contain the elements that were upserted" + ); + Ok(()) + } +} From 08197178ca094fe9911b200cfefd3f0cffec08b9 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 11:48:07 -0800 Subject: [PATCH 03/10] update the test case --- tests/leaderboard/mod.rs | 80 +++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/tests/leaderboard/mod.rs b/tests/leaderboard/mod.rs index c016de1..d0cdc6e 100644 --- a/tests/leaderboard/mod.rs +++ b/tests/leaderboard/mod.rs @@ -352,22 +352,53 @@ mod fetch_by_score { } mod get_competition_rank { - use momento::leaderboard::GetRankRequest; + use momento::leaderboard::{Element, GetRankRequest, RankedElement}; use super::*; + fn test_competition_leaderboard() -> Vec { + vec![ + Element { id: 0, score: 20.0 }, + Element { id: 1, score: 10.0 }, + Element { id: 2, score: 10.0 }, + Element { id: 3, score: 5.0 }, + ] + } + #[tokio::test] async fn get_competition_rank_of_elements() -> MomentoResult<()> { let leaderboard = unique_leaderboard(); - let test_leaderboard = TestLeaderboard::new(); - leaderboard.upsert(test_leaderboard.elements()).await?; + leaderboard.upsert(test_competition_leaderboard()).await?; - let response = leaderboard.get_rank(test_leaderboard.ids()).await?; + let response = leaderboard + .get_competition_rank([0, 1, 2, 3, 4], None) + .await?; assert_eq!( - test_leaderboard.ranked_elements(), + vec![ + RankedElement { + id: 0, + score: 20.0, + rank: 0 + }, + RankedElement { + id: 1, + score: 10.0, + rank: 1 + }, + RankedElement { + id: 2, + score: 10.0, + rank: 1 + }, + RankedElement { + id: 3, + score: 5.0, + rank: 3 + }, + ], response.elements(), - "Expected the leaderboard to contain the elements that were upserted" + "Expected the leaderboard to be sorted in 0113 order" ); Ok(()) } @@ -375,24 +406,37 @@ mod get_competition_rank { #[tokio::test] async fn get_rank_of_elements_asc() -> MomentoResult<()> { let leaderboard = unique_leaderboard(); - let test_leaderboard = TestLeaderboard::new(); - leaderboard.upsert(test_leaderboard.elements()).await?; + leaderboard.upsert(test_competition_leaderboard()).await?; let response = leaderboard - .send_request(GetRankRequest::new(test_leaderboard.ids()).order(Order::Ascending)) + .get_competition_rank([0, 1, 2, 3, 4], Some(Order::Ascending)) .await?; - let mut ranked_elements = test_leaderboard.ranked_elements(); - let num_elements = ranked_elements.len(); - // adjust ranks - for (i, e) in ranked_elements.iter_mut().enumerate() { - e.rank = (num_elements - i - 1) as u32; - } - assert_eq!( - ranked_elements, + vec![ + RankedElement { + id: 0, + score: 20.0, + rank: 3 + }, + RankedElement { + id: 1, + score: 10.0, + rank: 1 + }, + RankedElement { + id: 2, + score: 10.0, + rank: 1 + }, + RankedElement { + id: 3, + score: 5.0, + rank: 0 + }, + ], response.elements(), - "Expected the leaderboard to contain the elements that were upserted" + "Expected the leaderboard to be sorted in 3110 order" ); Ok(()) } From cd6127409b5182e2a6c54fb84b7736f2012ecba5 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 11:56:26 -0800 Subject: [PATCH 04/10] split out order into its own builder method --- src/leaderboard/leaderboard_resource.rs | 5 +---- .../messages/data/get_competition_rank.rs | 16 ++++++++++++++-- tests/leaderboard/mod.rs | 7 +++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/leaderboard/leaderboard_resource.rs b/src/leaderboard/leaderboard_resource.rs index ea04016..25345b6 100644 --- a/src/leaderboard/leaderboard_resource.rs +++ b/src/leaderboard/leaderboard_resource.rs @@ -21,8 +21,6 @@ use tonic::transport::Channel; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::Duration; -use super::Order; - static NEXT_DATA_CLIENT_INDEX: AtomicUsize = AtomicUsize::new(0); /// Represents a remote leaderboard resource. @@ -109,9 +107,8 @@ impl Leaderboard { pub async fn get_competition_rank( &self, ids: impl IntoIterator, - rank: Option, ) -> MomentoResult { - let request = GetCompetitionRankRequest::new(ids, rank); + let request = GetCompetitionRankRequest::new(ids); request.send(self).await } diff --git a/src/leaderboard/messages/data/get_competition_rank.rs b/src/leaderboard/messages/data/get_competition_rank.rs index edb10ef..1753ac1 100644 --- a/src/leaderboard/messages/data/get_competition_rank.rs +++ b/src/leaderboard/messages/data/get_competition_rank.rs @@ -10,12 +10,24 @@ pub struct GetCompetitionRankRequest { } impl GetCompetitionRankRequest { - pub fn new(ids: impl IntoIterator, order: Option) -> Self { + /// Constructs a new `GetCompetitionRankRequest`. + /// + /// Defaults to DESCENDING order, meaning that rank 0 + /// is the element with the highest score. + pub fn new(ids: impl IntoIterator) -> Self { Self { ids: ids.into_iter().collect(), - order: order.unwrap_or(Order::Descending), + order: Order::Descending, } } + + /// Sets the order ranking. + /// + /// Defaults to DESCENDING order. + pub fn order(mut self, order: Order) -> Self { + self.order = order; + self + } } impl LeaderboardRequest for GetCompetitionRankRequest { diff --git a/tests/leaderboard/mod.rs b/tests/leaderboard/mod.rs index d0cdc6e..6ad791f 100644 --- a/tests/leaderboard/mod.rs +++ b/tests/leaderboard/mod.rs @@ -352,7 +352,10 @@ mod fetch_by_score { } mod get_competition_rank { - use momento::leaderboard::{Element, GetRankRequest, RankedElement}; + use momento::leaderboard::{ + messages::data::get_competition_rank::GetCompetitionRankRequest, Element, GetRankRequest, + RankedElement, + }; use super::*; @@ -371,7 +374,7 @@ mod get_competition_rank { leaderboard.upsert(test_competition_leaderboard()).await?; let response = leaderboard - .get_competition_rank([0, 1, 2, 3, 4], None) + .send_request(GetCompetitionRankRequest::new([0, 1, 2, 3, 4]).order(Order::Ascending)) .await?; assert_eq!( From d0d3e7a792763a5ff959eb0628ffc90a603d7064 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 12:03:58 -0800 Subject: [PATCH 05/10] add javadoc --- src/leaderboard/leaderboard_resource.rs | 4 ++++ src/leaderboard/messages/data/get_competition_rank.rs | 1 + src/leaderboard/messages/data/mod.rs | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/leaderboard/leaderboard_resource.rs b/src/leaderboard/leaderboard_resource.rs index 25345b6..a7cb0be 100644 --- a/src/leaderboard/leaderboard_resource.rs +++ b/src/leaderboard/leaderboard_resource.rs @@ -104,6 +104,10 @@ impl Leaderboard { request.send(self).await } + /// Get rank of elements, using competition ranking, from a leaderboard using their element ids. + /// + /// Defaults to DESCENDING order rank, meaning rank 0 is the element with + /// the highest score. pub async fn get_competition_rank( &self, ids: impl IntoIterator, diff --git a/src/leaderboard/messages/data/get_competition_rank.rs b/src/leaderboard/messages/data/get_competition_rank.rs index 1753ac1..d833077 100644 --- a/src/leaderboard/messages/data/get_competition_rank.rs +++ b/src/leaderboard/messages/data/get_competition_rank.rs @@ -4,6 +4,7 @@ use crate::leaderboard::LeaderboardRequest; use crate::utils::prep_leaderboard_request_with_timeout; use crate::{Leaderboard, MomentoResult}; +/// A request to get ranked elements, sorted by competition ranking, by providing a list of element IDs. pub struct GetCompetitionRankRequest { ids: Vec, order: Order, diff --git a/src/leaderboard/messages/data/mod.rs b/src/leaderboard/messages/data/mod.rs index a951daa..3ee40c3 100644 --- a/src/leaderboard/messages/data/mod.rs +++ b/src/leaderboard/messages/data/mod.rs @@ -9,6 +9,8 @@ pub mod fetch_by_rank; /// Contains the request and response types for requesting elements from a /// leaderboard by score. pub mod fetch_by_score; +/// Contains the request and response types for requesting elements, sorted +/// by competition ranking, from a leaderboard using their element ids. pub mod get_competition_rank; /// Contains the request and response types for requesting elements from a /// leaderboard using their element ids. From bd75dd9d3612287ca2f041df5d6107ef84e2e3fd Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 12:09:51 -0800 Subject: [PATCH 06/10] kick the GH pr action runner From 5d07ce6c456093b2d5fbd66895b29f6307c9f7f4 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 12:16:14 -0800 Subject: [PATCH 07/10] ok fine --- tests/leaderboard/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/leaderboard/mod.rs b/tests/leaderboard/mod.rs index 6ad791f..0044a1a 100644 --- a/tests/leaderboard/mod.rs +++ b/tests/leaderboard/mod.rs @@ -353,7 +353,7 @@ mod fetch_by_score { mod get_competition_rank { use momento::leaderboard::{ - messages::data::get_competition_rank::GetCompetitionRankRequest, Element, GetRankRequest, + messages::data::get_competition_rank::GetCompetitionRankRequest, Element, RankedElement, }; @@ -374,7 +374,7 @@ mod get_competition_rank { leaderboard.upsert(test_competition_leaderboard()).await?; let response = leaderboard - .send_request(GetCompetitionRankRequest::new([0, 1, 2, 3, 4]).order(Order::Ascending)) + .get_competition_rank([0, 1, 2, 3, 4]) .await?; assert_eq!( @@ -412,7 +412,7 @@ mod get_competition_rank { leaderboard.upsert(test_competition_leaderboard()).await?; let response = leaderboard - .get_competition_rank([0, 1, 2, 3, 4], Some(Order::Ascending)) + .send_request(GetCompetitionRankRequest::new([0, 1, 2, 3, 4]).order(Order::Ascending)) .await?; assert_eq!( From dc5f75177493c931807791b55ce428259206bd40 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 12:19:48 -0800 Subject: [PATCH 08/10] kick the GH pr action runner again From e8c1e071785b0d7d29ca083225c892ad156bb814 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 12:21:13 -0800 Subject: [PATCH 09/10] sacrifice a goat to please the linter god --- tests/leaderboard/mod.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/leaderboard/mod.rs b/tests/leaderboard/mod.rs index 0044a1a..21cc6b1 100644 --- a/tests/leaderboard/mod.rs +++ b/tests/leaderboard/mod.rs @@ -353,8 +353,7 @@ mod fetch_by_score { mod get_competition_rank { use momento::leaderboard::{ - messages::data::get_competition_rank::GetCompetitionRankRequest, Element, - RankedElement, + messages::data::get_competition_rank::GetCompetitionRankRequest, Element, RankedElement, }; use super::*; @@ -373,9 +372,7 @@ mod get_competition_rank { let leaderboard = unique_leaderboard(); leaderboard.upsert(test_competition_leaderboard()).await?; - let response = leaderboard - .get_competition_rank([0, 1, 2, 3, 4]) - .await?; + let response = leaderboard.get_competition_rank([0, 1, 2, 3, 4]).await?; assert_eq!( vec![ From a2d0f42fad0a658b6187a2c49ebb747f1c274fc5 Mon Sep 17 00:00:00 2001 From: Vir Ratanasangpunth Date: Wed, 12 Feb 2025 12:23:56 -0800 Subject: [PATCH 10/10] looks like i need to commit twice before GH picks up my changes