Vaadin Data Provider - сортировка с бэкэндом с использованием bean-компонента в качестве параметра в запросе - PullRequest
0 голосов
/ 03 апреля 2019

Фон

Я пытаюсь разрешить сортировку данных в сетке Ваадина. Данные извлекаются из бэкэнда с использованием вызовов REST. Типы бинов выглядят примерно так:

public class Event {

  private Type type;
  private LocalDateTime latest;

  //... getters, setters, etc.
}
public class Type {
  private String name;
  private String callCode;  

  //... getters, setters, etc. 
}

Мы используем FilterablePageableDataProvider ( исходный код ) для загрузки данных из серверной части. Важные методы:

dataProvider = new FilterablePageableDataProvider<Type, Object> {
            @Override
            protected Stream<Type> fetchFromBackEnd(Query<Type, Object> query) {            
                return typeService.fetchFromBackEnd(query);
            }

            @Override
            protected int sizeInBackEnd(Query<Type, Object> query) {
                return typeService.sizeInBackEnd(query);
            }

            @Override
            protected List<QuerySortOrder> getDefaultSortOrders() {
                return Sort.asc("name").build();
            }
};

Включение следующего кода для помещения его в столбец Grid<Type> работает нормально, и сортировка не представляет проблемы:

grid.addColumn(type -> type.getName()).setSortProperty("name");
grid.addColumn(type -> type.getCallCode()).setSortProperty("callCode");

Задача

Что меня устраивает, так это попытка выяснить, как сортировать столбцы при использовании элемента сетки в качестве параметра в запросе, например:

grid.addColumn(type -> eventService.countByType(type));

Использование setSortProperty(String ... properties) больше не работает, а об использовании Comparator не может быть и речи, потому что слишком много данных для сортировки в памяти.

Как сделать этот запрос сортируемым в моей сетке?

1 Ответ

0 голосов
/ 01 мая 2019
  1. Определите класс EventFilter, который имеет различные атрибуты, наряду с геттерами / сеттерами, по которым вам нужно фильтровать ваши записи.

  2. Передать экземпляр этого EventFilter экземпляру DataProvider.

  3. Экземпляр DataProvider использует атрибуты экземпляра EventFilter для извлечения необходимых записей. Экземпляр DataProvider имеет логика для извлечения свойства "sort" из объекта Query и извлечения записей соответственно. См. Код ниже.

public class EventDataProvider extends AbstractBackEndDataProvider<Event, Void> {
    private static final long serialVersionUID = 1L;

    private final ArrayList<String> messages = new ArrayList<>();
    private final Logic logic = new Logic();
    private final EventFilter filter;

    public EventDataProvider(EventFilter filter) {
        this.filter = filter;
    }

    @Override
    protected Stream<Event> fetchFromBackEnd(Query<Event, Void> query) {
        // TODO Auto-generated method stub
        SortingInfo sortingInfo = null;
        if (query.getSortOrders() != null && !query.getSortOrders().isEmpty()) {
            QuerySortOrder sortOrder = query.getSortOrders().get(query.getSortOrders().size() - 1);
            sortingInfo = new SortingInfo(sortOrder.getSorted(), sortOrder.getDirection());
        } else {
            sortingInfo = new SortingInfo("date", SortDirection.DESCENDING);
        }
        return logic.getEvents(messages, filter, query.getLimit(), query.getOffset(), sortingInfo).stream();
    }

    @Override
    protected int sizeInBackEnd(Query<Event, Void> query) {
        // TODO Auto-generated method stub
        return logic.getEventsCount(messages, filter);
    }

    @Override
    public Object getId(Event item) {
        // TODO Auto-generated method stub
        return item.getDate() + "-" + item.getSlotId() + "-" + item.getLocationId();
    }
}
...