Я пытаюсь реализовать какую-то функцию разбиения на страницы для моего приложения, использующую кассандру в бэкэнде.
CREATE TABLE sample (
some_pk int,
some_id int,
name1 txt,
name2 text,
value text,
PRIMARY KEY (some_pk, some_id, name1, name2)
)
WITH CLUSTERING ORDER BY(some_id DESC)
Я хочу запросить 100 записей, а затем сохранить ключи последних записей в памяти, чтобы использовать их позже.
+---------+---------+-------+-------+-------+
| sample_pk| some_id | name1 | name2 | value |
+---------+---------+-------+-------+-------+
| 1 | 125 | x | '' | '' |
+---------+---------+-------+-------+-------+
| 1 | 124 | a | '' | '' |
+---------+---------+-------+-------+-------+
| 1 | 124 | b | '' | '' |
+---------+---------+-------+-------+-------+
| 1 | 123 | y | '' | '' |
+---------+---------+-------+-------+-------+
(для простоты я оставил некоторые столбцы пустыми. Ключ раздела (sample_pk) не важен)
давайте предположим, что размер моей страницы равен 2.
select * from sample where sample_pk=1 limit 2;
возвращает первые 2 строки. теперь я сохраняю последнюю запись в своем результате запроса и снова запускаю запрос, чтобы получить следующие 2 строки;
этот запрос не работает из-за ограничения одного отношения не-EQ
select * from where sample_pk=1 and some_id <= 124 and name1>='a' and name2>='' limit 2;
и этот возвращает неправильные результаты, потому что some_id находится в порядке убывания, а столбцы имен в порядке возрастания.
select * from where sample_pk=1 and (some_id, name1, name2) <= (124, 'a', '') limit 2;
Так что я застрял. Как я могу реализовать нумерацию страниц?