From cf52ab6f7f4f96d552b2c6c828fc40704460046f Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Mon, 8 Aug 2022 18:31:11 +0200 Subject: implement before and after filters for matches --- planetwars-server/src/db/matches.rs | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'planetwars-server/src/db/matches.rs') diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs index b806dd3..22cb564 100644 --- a/planetwars-server/src/db/matches.rs +++ b/planetwars-server/src/db/matches.rs @@ -130,13 +130,34 @@ pub fn list_matches(amount: i64, conn: &PgConnection) -> QueryResult QueryResult> { +pub fn list_public_matches( + amount: i64, + before: Option, + after: Option, + conn: &PgConnection, +) -> QueryResult> { conn.transaction(|| { - let matches = matches::table + // TODO: how can this common logic be abstracted? + // TODO: this is not nice. Replace this with proper cursor logic. + let mut query = matches::table .filter(matches::is_public.eq(true)) - .order_by(matches::created_at.desc()) - .limit(amount) - .get_results::(conn)?; + .into_boxed(); + + query = match (before, after) { + (None, None) => query.order_by(matches::created_at.desc()), + (Some(before), None) => query + .filter(matches::created_at.lt(before)) + .order_by(matches::created_at.desc()), + (None, Some(after)) => query + .filter(matches::created_at.gt(after)) + .order_by(matches::created_at.asc()), + (Some(before), Some(after)) => query + .filter(matches::created_at.lt(before)) + .filter(matches::created_at.gt(after)) + .order_by(matches::created_at.desc()), + }; + + let matches = query.limit(amount).get_results::(conn)?; fetch_full_match_data(matches, conn) }) @@ -145,11 +166,15 @@ pub fn list_public_matches(amount: i64, conn: &PgConnection) -> QueryResult, + after: Option, conn: &PgConnection, ) -> QueryResult> { conn.transaction(|| { let matches = matches::table .filter(matches::is_public.eq(true)) + .filter(matches::created_at.nullable().lt(before)) + .filter(matches::created_at.nullable().gt(after)) .order_by(matches::created_at.desc()) .inner_join(match_players::table) .inner_join( -- cgit v1.2.3