From 67ea6aaacc8b6a55e5180ec3e8349230053010f0 Mon Sep 17 00:00:00 2001 From: oxalica Date: Fri, 6 Sep 2024 04:00:19 -0400 Subject: [PATCH] Impl `untilToken` for `item_list` to avoid over-fetching seen items --- blahd/src/main.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/blahd/src/main.rs b/blahd/src/main.rs index 23adac9..8469cd9 100644 --- a/blahd/src/main.rs +++ b/blahd/src/main.rs @@ -229,6 +229,7 @@ async fn room_list( let pagination = Pagination { skip_token: params.skip_token, top: params.top, + until_token: None, }; let page_len = pagination.effective_page_len(&st); let start_rid = pagination.skip_token.unwrap_or(Id(0)); @@ -453,6 +454,9 @@ struct Pagination { skip_token: Option, /// Maximum page size. top: Option, + /// Only return items before (excluding) this token. + /// Useful for `room_item_list` to pass `last_seen_cid` without over-fetching. + until_token: Option, } impl Pagination { @@ -552,6 +556,7 @@ async fn room_get_feed( let next_params = Pagination { skip_token: Some(skip_token), top: pagination.top, + until_token: None, }; let mut next_url = feed_url.clone(); { @@ -672,7 +677,8 @@ fn query_room_items( FROM `room_item` JOIN `user` USING (`uid`) WHERE `rid` = :rid AND - (:before_cid IS NULL OR `cid` < :before_cid) + :after_cid < `cid` AND + `cid` < :before_cid ORDER BY `cid` DESC LIMIT :limit ", @@ -681,7 +687,8 @@ fn query_room_items( .query_and_then( named_params! { ":rid": rid, - ":before_cid": pagination.skip_token, + ":after_cid": pagination.until_token.unwrap_or(Id(-1)), + ":before_cid": pagination.skip_token.unwrap_or(Id(i64::MAX)), ":limit": page_len, }, |row| {