Подтвердить что ты не робот

Отображение результатов в Cassandra (CQL)

Мне интересно, как я могу достичь разбивки на страницы с помощью Cassandra.

Скажем, у меня есть блог. В блоге указано максимум 10 сообщений на странице. Чтобы получить доступ к следующим сообщениям, пользователь должен щелкнуть по меню разбивки на страницы для доступа к странице 2 (сообщения 11-20), стр. 3 (сообщения 21-30) и т.д.

Используя SQL в MySQL, я мог бы сделать следующее:

SELECT * FROM posts LIMIT 20,10;

Первый параметр LIMIT смещен от начала набора результатов, а второй аргумент - количество строк для извлечения. В приведенном выше примере возвращается 10 строк, начиная с строки 20.

Как я могу добиться такого же эффекта в CQL?

Я нашел некоторые решения в Google, но все они требуют иметь "последний результат из предыдущего запроса". Он работает для того, чтобы "следующая" кнопка разбивалась на страницу на 10 результатов, но что, если я хочу перейти со страницы 1 на страницу 5?

4b9b3361

Ответ 2

Вам не нужно использовать токены, если вы используете Cassandra 2.0 +.

В Cassandra 2.0 есть автоматический подкачки. Вместо того, чтобы использовать функцию токена для создания подкачки, теперь это встроенная функция.

Теперь разработчики могут выполнять итерацию по всему набору результатов, не заботясь о том, что его размер больше памяти. Когда код клиента выполняет итерацию по результатам, некоторые дополнительные строки могут быть извлечены, а старые - удалены.

Посмотрите на это в Java, обратите внимание, что оператор SELECT возвращает все строки, а число найденных строк равно 100.

Здесь показан простой оператор, но тот же код может быть написан с помощью подготовленного оператора, пара с привязанным выражением. Если это нежелательно, можно отключить автоматический поисковый вызов. Также важно проверить различные параметры размера выборки, так как вы захотите сохранить запоминание достаточно маленьким, но не настолько маленьким, чтобы было сделано слишком много обращений к базе данных. Зайдите в этот блог, чтобы узнать, как работает поисковая система на стороне сервера.

Statement stmt = new SimpleStatement(
                  "SELECT * FROM raw_weather_data"
                  + " WHERE wsid= '725474:99999'"
                    + " AND year = 2005 AND month = 6");
stmt.setFetchSize(24);
ResultSet rs = session.execute(stmt);
Iterator<Row> iter = rs.iterator();
while (!rs.isFullyFetched()) {
   rs.fetchMoreResults();
   Row row = iter.next();
   System.out.println(row);
}

Ответ 3

Ручной пейджинг

Драйвер предоставляет объект PagingState, который представляет, где мы были в результирующем наборе, когда была выбрана последняя страница:

ResultSet resultSet = session.execute("your query");
// iterate the result set...
PagingState pagingState = resultSet.getExecutionInfo().getPagingState();

Этот объект может быть сериализован в массив String или byte:

String string = pagingState.toString();
byte[] bytes = pagingState.toBytes();

Эта сериализованная форма может быть сохранена в некоторой форме постоянного хранилища, которая будет использоваться позже. Когда это значение будет получено позже, мы можем десериализовать его и повторно ввести его в оператор:

PagingState pagingState = PagingState.fromString(string);
Statement st = new SimpleStatement("your query");
st.setPagingState(pagingState);
ResultSet rs = session.execute(st);

Обратите внимание, что состояние поискового вызова может быть повторно использовано только с помощью одного и того же оператора (такая же строка запроса, те же параметры). Кроме того, это непрозрачное значение, которое предназначено для сбора, хранения и повторного использования. Если вы попытаетесь изменить его содержимое или повторно использовать его с помощью другого оператора, драйвер вызывает ошибку.

Src: http://datastax.github.io/java-driver/manual/paging/

Ответ 4

Если вы прочитали этот документ "Использовать токен подкачки для получения следующего результата",

https://datastax.github.io/php-driver/features/result_paging/

Мы можем использовать "токен страницы подкачки" для разбивки на страницы приложения на уровне приложения. Итак, логика PHP должна выглядеть так:

<?php
$limit = 10;
$offset = 20;

$cluster   = Cassandra::cluster()->withContactPoints('127.0.0.1')->build();
$session   = $cluster->connect("simplex");
$statement = new Cassandra\SimpleStatement("SELECT * FROM paging_entries Limit ".($limit+$offset));

$result = $session->execute($statement, new Cassandra\ExecutionOptions(array('page_size' => $offset)));
// Now $result has all rows till "$offset" which we can skip and jump to next page to fetch "$limit" rows.

while ($result->pagingStateToken()) {
    $result = $session->execute($statement, new Cassandra\ExecutionOptions($options = array('page_size' => $limit,'paging_state_token' => $result->pagingStateToken())));
    foreach ($result as $row) {
      printf("key: '%s' value: %d\n", $row['key'], $row['value']);
    }
}
?>

Ответ 5

Хотя счетчик доступен в CQL, до сих пор я не видел хорошего решения для смещенной части...

Итак... одним из решений, которое я рассматривал, было создание наборов страниц с использованием фонового процесса.

В некоторой таблице я бы создал страницу блога A как набор ссылок на страницы 1, 2,... 10. Затем еще одна запись для страницы блога B, указывающая на страницы с 11 по 20 и т.д.

Другими словами, я бы построил свой собственный индекс с ключом строки, установленным на номер страницы. Вы все же можете сделать его несколько гибким, так как вы можете предложить пользователю выбрать 10, 20 или 30 ссылок на страницу. Например, когда установлено значение 30, вы показываете наборы 1, 2 и 3 в качестве страницы A, устанавливает 4, 5, 6 в качестве страницы B и т.д.)

И если у вас есть базовый процесс для обработки всего этого, вы можете обновить свои списки по мере добавления новых страниц и удаления старых страниц из блога. Процесс должен быть очень быстрым (например, 1 мин на 1 000 000 строк, если даже это медленно...), и вы можете быстро найти страницы, которые будут отображаться в вашем списке. (Очевидно, если вы хотите, чтобы тысячи пользователей отправляли сотни страниц... это число может быстро расти.)

Там, где это становится более сложным, вы хотите предложить сложное предложение WHERE. По умолчанию в блоге отображается список всех сообщений от самого нового до самого старого. Вы также можете предлагать списки сообщений с тегом Cassandra. Возможно, вы хотите отменить заказ и т.д. Это затрудняет работу, если у вас нет какой-либо расширенной возможности для создания вашего индекса (ов). На моем конце у меня есть C-подобный язык, который идет и заглядывает и выкапывает значения в строке, чтобы (a) выбрать их и, если выбрано (b), сортировать их. Другими словами, с моей точки зрения, у меня уже могут быть предложения WHERE настолько сложными, как у вас в SQL. Тем не менее, я еще не разбил свои списки на страницах. Следующий шаг, я полагаю...