public Mono<List<Book>> findBooks(@Positive long page, @Positive long size) {
return template
.select(Book.class)
.count()
.flatMap(total -> {
Tuple2<Long, Long> skipAndTake = getSkipAndTake(total, page, size);
return template
.select(Book.class)
.all()
.skip(skipAndTake.getT1())
.take(skipAndTake.getT2())
.collectSortedList((Book b1, Book b2) ->
(int) (b2.getBookId() - b1.getBookId()));
});
}
private Tuple2<Long, Long> getSkipAndTake(long total, long movePage, long size) {
long totalPages = (long) Math.ceil((double) total / size);
long page = movePage > totalPages ? totalPages : movePage;
long skip = total - (page * size) < 0 ? 0 : total - (page * size);
long take = total - (page * size) < 0 ? total - ((page - 1) * size) : size;
return Tuples.of(skip, take);
}