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

Merge request reports

Loading