diff --git a/server/src/graphql.rs b/server/src/graphql.rs index 6cff256..ea7b0d9 100644 --- a/server/src/graphql.rs +++ b/server/src/graphql.rs @@ -302,10 +302,7 @@ impl QueryRoot { if let Some(last) = last { if results.len() > last { has_previous_page = true; - // TODO: find better way to do this. - results.reverse(); results.truncate(last); - results.reverse(); } } @@ -325,10 +322,6 @@ impl QueryRoot { notmuch_offset = offset; } } - info!( - "item: {} {}", - thread_summary.subject, thread_summary.timestamp - ); let cur = OpaqueCursor(SearchCursor { newsreader_offset, notmuch_offset, diff --git a/server/src/lib.rs b/server/src/lib.rs index e8d065a..d63c149 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -357,8 +357,8 @@ fn compute_offset_limit( // Reasonable defaults (None, None, None, None) => (0, default_page_size), (None, None, Some(first), None) => (0, first), - (Some(after), None, None, None) => (after, default_page_size), - (Some(after), None, Some(first), None) => (after, first), + (Some(after), None, None, None) => (after + 1, default_page_size), + (Some(after), None, Some(first), None) => (after + 1, first), (None, Some(before), None, None) => (0.max(before - default_page_size), default_page_size), (None, Some(before), None, Some(last)) => (0.max(before - last), last), (None, None, None, Some(_)) => { diff --git a/server/src/newsreader.rs b/server/src/newsreader.rs index 8ec1837..4de5f5d 100644 --- a/server/src/newsreader.rs +++ b/server/src/newsreader.rs @@ -43,9 +43,13 @@ pub async fn search( query: &Query, ) -> Result, async_graphql::Error> { info!("search({after:?} {before:?} {first:?} {last:?} {query:?}"); - let (offset, limit) = compute_offset_limit(after, before, first, last); - // The +1 is to see if there are more pages of data available. - let limit = limit + 1; + let (offset, mut limit) = compute_offset_limit(after, before, first, last); + if before.is_none() { + // When searching forward, the +1 is to see if there are more pages of data available. + // Searching backwards implies there's more pages forward, because the value represented by + // `before` is on the next page. + limit = limit + 1; + } info!("search offset {offset} limit {limit}"); let rows = sqlx::query_file!(