Предикат смещения Hazelcast

В Hazelcast реализован PagingPredicate, который помогает получать данные постранично.

Есть ли возможность получить данные со смещением и лимитом? (Не страница за страницей)


person Andrey Korkoshko    schedule 13.06.2018    source источник


Ответы (2)


Существует BetweenPredicate, который достигнет того, что вы ищете.

person diginoise    schedule 13.06.2018
comment
Нет. Мне нужно получить отсортированные данные со смещением, как в базах данных SQL. Этот предикат помогает собирать данные между двумя сопоставимыми элементами. - person Andrey Korkoshko; 13.06.2018
comment
вы можете использовать SqlPredicate, но это может быть неэффективно. Если это карта, вы можете добавить упорядоченный индекс в поле, по которому вам нужна сортировка. - person diginoise; 13.06.2018

Я не нашел лучшего решения, чем рассчитать и получить две страницы с помощью PagingPredicate и получить подсписок из этого результата, чтобы получить данные со смещением и ограничением, как в базах данных SQL.

Пример метода:

public Set<M> findOffsetValues(int offset,int limit) {
    PagingPredicate pagingPredicate = new PagingPredicate<>(getDefaultComporator(), limit);
    pagingPredicate.setPage(offset / limit);
    List<M> page = new ArrayList<>(itemsCacheMap.values(pagePredicate));
    pagePredicate.nextPage();
    page.addAll(itemsCacheMap.values(pagePredicate));
    int startIndex = offset % limit;
    return new LinkedHashSet<>(CollectionUtil.saveSublist(page, startIndex, startIndex + limit));
}

Вспомогательный метод CollectionUtil.saveSublist

public static <E> List<E> saveSublist(List<E> list, int fromIndex, int toIndex) {
    int checkedFromIndex = list.size() == 0
                           ? 0
                           : fromIndex >= list.size() ? list.size() - 1 : fromIndex;
    int checkedToIndex = toIndex > list.size() ? list.size() : toIndex;
    return list.subList(checkedFromIndex, checkedToIndex);
}
person Andrey Korkoshko    schedule 13.08.2018