Impl untilToken for item_list to avoid over-fetching seen items

This commit is contained in:
oxalica 2024-09-06 04:00:19 -04:00
parent 8b096ba802
commit 67ea6aaacc

View file

@ -229,6 +229,7 @@ async fn room_list(
let pagination = Pagination { let pagination = Pagination {
skip_token: params.skip_token, skip_token: params.skip_token,
top: params.top, top: params.top,
until_token: None,
}; };
let page_len = pagination.effective_page_len(&st); let page_len = pagination.effective_page_len(&st);
let start_rid = pagination.skip_token.unwrap_or(Id(0)); let start_rid = pagination.skip_token.unwrap_or(Id(0));
@ -453,6 +454,9 @@ struct Pagination {
skip_token: Option<Id>, skip_token: Option<Id>,
/// Maximum page size. /// Maximum page size.
top: Option<NonZeroUsize>, top: Option<NonZeroUsize>,
/// Only return items before (excluding) this token.
/// Useful for `room_item_list` to pass `last_seen_cid` without over-fetching.
until_token: Option<Id>,
} }
impl Pagination { impl Pagination {
@ -552,6 +556,7 @@ async fn room_get_feed(
let next_params = Pagination { let next_params = Pagination {
skip_token: Some(skip_token), skip_token: Some(skip_token),
top: pagination.top, top: pagination.top,
until_token: None,
}; };
let mut next_url = feed_url.clone(); let mut next_url = feed_url.clone();
{ {
@ -672,7 +677,8 @@ fn query_room_items(
FROM `room_item` FROM `room_item`
JOIN `user` USING (`uid`) JOIN `user` USING (`uid`)
WHERE `rid` = :rid AND WHERE `rid` = :rid AND
(:before_cid IS NULL OR `cid` < :before_cid) :after_cid < `cid` AND
`cid` < :before_cid
ORDER BY `cid` DESC ORDER BY `cid` DESC
LIMIT :limit LIMIT :limit
", ",
@ -681,7 +687,8 @@ fn query_room_items(
.query_and_then( .query_and_then(
named_params! { named_params! {
":rid": rid, ":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, ":limit": page_len,
}, },
|row| { |row| {