com.vaadin.data.provider.AbstractBackEndDataProvider Maven / Gradle / Ivy
/*
* Copyright (C) 2000-2024 Vaadin Ltd
*
* This program is available under Vaadin Commercial License and Service Terms.
*
* See for the full
* license.
*/
package com.vaadin.data.provider;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Abstract base class for implementing back end data providers.
*
* @param
* data provider data type
* @param
* data provider filter type
* @since 8.0
*/
public abstract class AbstractBackEndDataProvider extends
AbstractDataProvider implements BackEndDataProvider {
private List sortOrders = new ArrayList<>();
private Query mixInSortOrders(Query query) {
if (sortOrders.isEmpty()) {
return query;
}
Set sortedPropertyNames = query.getSortOrders().stream()
.map(SortOrder::getSorted).collect(Collectors.toSet());
List combinedSortOrders = Stream
.concat(query.getSortOrders().stream(),
sortOrders.stream()
.filter(order -> !sortedPropertyNames
.contains(order.getSorted())))
.collect(Collectors.toList());
return new Query<>(query.getOffset(), query.getLimit(),
combinedSortOrders, query.getInMemorySorting(),
query.getFilter().orElse(null));
}
@Override
public Stream fetch(Query query) {
return fetchFromBackEnd(mixInSortOrders(query));
}
@Override
public int size(Query query) {
return sizeInBackEnd(mixInSortOrders(query));
}
/**
* Fetches data from the back end using the given query.
*
* @param query
* the query that defines sorting, filtering and paging for
* fetching the data
* @return a stream of items matching the query
*/
protected abstract Stream fetchFromBackEnd(Query query);
/**
* Counts the number of items available in the back end.
*
* @param query
* the query that defines filtering to be used for counting the
* number of items
* @return the number of available items
*/
protected abstract int sizeInBackEnd(Query query);
@Override
public void setSortOrders(List sortOrders) {
this.sortOrders = Objects.requireNonNull(sortOrders,
"Sort orders cannot be null");
refreshAll();
}
}