Числовое ограничение по нумерации и нумерации страниц в DynamoDB - PullRequest
1 голос
/ 20 сентября 2019

Я хочу реализовать нумерацию нумерации по пределам и смещениям в DynamoDB аналогично Postgres .

Мой API выглядит примерно так: http://foo.bar/user?offset=50&limit=20.

Что такоелучший способ сделать это в Java без риска OutOfMemoryError, учитывая, что DynamoDB использует ExclusiveStartKey и LastEvaluatedKey для разбивки на страницы ?

РЕДАКТИРОВАТЬ:

Давайте предположим, что смещение основано на нумерации страницэто жесткое требование, и я не знаю предыдущую страницу.Мой контракт API имеет параметры запроса offset и limit, как описано выше.Я не ищу ответы "не делайте пагинацию на основе смещения".

1 Ответ

0 голосов
/ 20 сентября 2019

Посмотрев о том, как PaginatedList работает в SDK , кажется, что наиболее эффективный способ - это использовать ITERATION_ONLY стратегию загрузки пагинации в конфигурации и сделать что-то вроде этого:

DynamoDBMapperConfig config = new DynamoDBMapperConfig.Builder()
                       .withPaginationLoadingStrategy(ITERATION_ONLY)
                       .build();
PaginatedQueryList<MyUser> users = dynamoDBMapper.query(MyUser.class, myQueryExpression, config);
// This iterator will fetch 1MB worth of data 'on-demand'
Iterator<MyUser> userIterator = users.iterator();
skip(iterator, offset);
List<MyUser> aPageOfUser = collect(iterator, limit);

Конечно, я возьму на себя расходы по реализации моего собственного метода skip и collect.Есть ли лучший / более краткий способ сделать это?

EDIT:

Кажется, я могу использовать IteratorUtils из commons-collection , чтобы иметь skip иcollect бесплатно:

Iterator<MyUser> userIterator = IteratorUtils.boundedIterator(users.iterator(), offset, limit);
List<MyUser> aPageOfUser = IteratorUtils.toList(userIterator);

...