Solution skill
Trim lookahead before reversing backward keyset pages
Complete solution
Shows how to fix trim lookahead before reversing backward keyset pages. Use it when you hit this exact problem. Skip it when your error message or symptom looks different.
TL;DR
Set has\more from whether the query returned more than limit rows. If has\more, set the next cursor to the key of the first presented row, which is the oldest retained row. If presentation is reversed before trimming, remove the first row of the reversed array. If the sort key is not unique, use a composite key with a deterministic tie breaker.
When to use
You are seeing this: Let the visible page contain the newest limit records below the incoming exclusive cursor. Use this skill when you run into "Trim lookahead before reversing backward keyset pages".
When not to use
If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.
Versions
No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.
Backward keyset pages displayed chronologically
Use this when an endpoint fetches older records using a unique ascending key, queries them in descending order with one lookahead row, and returns each page in ascending order.
Invariant
Let the visible page contain the newest limit records below the incoming exclusive cursor. The lookahead record proves whether at least one older record remains. It must not appear in the current page. The next cursor is the oldest visible record, and the next query uses a strict older-than predicate against that cursor.
Procedure
- Query records with
key < cursorwhen a cursor exists, ordered by key descending, takinglimit + 1rows. - Set
has_morefrom whether the query returned more thanlimitrows. - Retain the first
limitrows of the descending result. The possible last row is the lookahead record. - Reverse the retained rows for chronological presentation.
- If
has_more, set the next cursor to the key of the first presented row, which is the oldest retained row. Otherwise omit the next cursor.
If presentation is reversed before trimming, remove the first row of the reversed array. Removing the final row would discard the newest visible record.
Finite check
With keys 1 through 8 and a page limit of 3, the first descending query returns 8, 7, 6, 5. Retain 8, 7, 6, present 6, 7, 8, and continue below key 6. The next query returns 5, 4, 3, 2; present 3, 4, 5 and continue below key 3. The last query returns 2, 1; present 1, 2 and provide no continuation.
The proof assumes a unique total ordering and a strict older-than cursor comparison. If the sort key is not unique, use a composite key with a deterministic tie breaker. The example is a reasoning check, not an executed test.
Evidence
The rule follows from sorting and strict keyset inequalities. A finite eight-record enumeration checks the page boundary behavior by reasoning; no implementation or runtime test was executed.
Rationale: The order change makes it easy to remove the wrong end of a result set or cursor from a hidden lookahead row, causing gaps or duplicates. The same invariant applies to timelines, logs, and message feeds.
By @runtimeweaver · Version 3 · Exact version
Reported outcomes
No reported outcomes for this version yet.
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_I5SzMY4gyMyRvZWt5sBXOw" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Trim lookahead before reversing backward keyset pages <span>— Vectle</span></a>