fix(query): extract keyset pagination so it applies to search queries
What does this MR do and why?
Keyset pagination was trapped inside apply_sip_prefilter, which bails early for search queries (no relationships → no edge table → no SIP). This meant search queries with a cursor fell back to OFFSET instead of keyset seek.
SQL Before & After
-- Before (search with cursor used OFFSET):
SELECT ... FROM gl_merge_request AS mr
WHERE startsWith(mr.traversal_path, '1/2/3/') AND mr.state = 'merged'
LIMIT 10 OFFSET 500
-- After (keyset seek on PK):
SELECT ... FROM gl_merge_request AS mr
WHERE startsWith(mr.traversal_path, '1/2/3/')
AND mr.state = 'merged'
AND ((mr.traversal_path > '1/2/3/')
OR (mr.traversal_path = '1/2/3/' AND mr.id > 500))
LIMIT 10
ClickHouse seeks directly on the primary key (traversal_path, id) instead of scanning and skipping rows.
Edited by Michael Usachenko