Как реализовать пагинацию в cassandra для API? - PullRequest
1 голос
/ 12 февраля 2020

Я хочу реализовать подкачку в cassandra с помощью QueryBuilder (datastax). Например, / api / 5 получит 5-ю страницу результатов с пределом 20. Насколько я прочитал, нам нужно сохранить состояние последней страницы. Можно ли получить прямой доступ к определенной странице. В принципе, каков эквивалент кассандры для предела x, смещения y?

Основной проблемой здесь является производительность (основанная на времени).

1 Ответ

1 голос
/ 12 февраля 2020

Все запросы выполняются драйвером, вы уже правы.

  • Вы можете определить размер вашей страницы с помощью следующего параметра в application.conf или в выписке.
datastax-java-driver.basic.request.page-size = 5000
  • В ResultSet возвращенный объект вы можете вызвать getAvailableWithoutFetching, чтобы узнать, сколько записей у вас на этой странице. Записи хранятся в Iterable, и когда вы дойдете до конца страницы, драйвер доставит вам следующую страницу под капотом. Документация для драйвера: https://docs.datastax.com/en/developer/java-driver/4.4/manual/core/paging/

  • Возможно, вы слышали о PagingState, который можно сохранить и использовать для повторной передачи при втором вызове с точным тот же запрос для прямого доступа к странице X - но это не то, что вам нужно.

до go с ограничением / смещением. Я бы просто перебрал записи в ResultSet как здесь:

public Stream<Stock> findAllBySymbol(
      @NonNull String symbol,
      @NonNull Instant start,
      @NonNull Instant end,
      long offset,
      long limit) {
    BoundStatement bound = findBySymbol.bind(symbol, start, end);
    ResultSet rs = session.execute(bound);
    Stream<Row> stream = Stream.iterate(rs.one(), Objects::nonNull, row -> rs.one());
    return stream.skip(offset).limit(limit).map(rowMapper);
  }

Источник. Вы можете заметить, что в репо у вас есть образцы для реактивного и асинхронного: https://github.com/datastax/cassandra-reactive-demo/blob/master/1_sync/src/main/java/com/datastax/demo/sync/repository/SyncStockRepository.java#L119

...