fix grid sorting
This commit is contained in:
parent
e4b0bc527b
commit
1ef06a57c0
2 changed files with 17 additions and 28 deletions
|
@ -24,11 +24,8 @@ import com.vaadin.flow.data.provider.AbstractBackEndDataProvider;
|
|||
import com.vaadin.flow.data.provider.Query;
|
||||
import com.vaadin.flow.data.provider.QuerySortOrder;
|
||||
import com.vaadin.flow.data.provider.SortDirection;
|
||||
import org.springframework.lang.NonNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
@ -37,10 +34,8 @@ import java.util.stream.Stream;
|
|||
* @since 30.05.18
|
||||
*/
|
||||
public class QueryDslDataProvider<T> extends AbstractBackEndDataProvider<T, Void> {
|
||||
private final List<SizeListener> sizeListeners;
|
||||
private final Supplier<JPAQuery<T>> fetchProvider;
|
||||
private final Supplier<JPAQuery<?>> countProvider;
|
||||
private final Map<String, Expression<? extends Comparable>> sortOptions;
|
||||
|
||||
public QueryDslDataProvider(JPAQuery<T> base) {
|
||||
this(base, base);
|
||||
|
@ -53,27 +48,14 @@ public class QueryDslDataProvider<T> extends AbstractBackEndDataProvider<T, Void
|
|||
public QueryDslDataProvider(Supplier<JPAQuery<T>> fetchProvider, Supplier<JPAQuery<?>> countProvider){
|
||||
this.fetchProvider = fetchProvider;
|
||||
this.countProvider = countProvider;
|
||||
sizeListeners = new ArrayList<>();
|
||||
sortOptions = new HashMap<>();
|
||||
}
|
||||
|
||||
public void addSizeListener(SizeListener listener) {
|
||||
sizeListeners.add(listener);
|
||||
}
|
||||
|
||||
public String addSortable(Expression<? extends Comparable> expression) {
|
||||
String id = String.valueOf(sortOptions.size());
|
||||
sortOptions.put(id, expression);
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Stream<T> fetchFromBackEnd(Query<T, Void> query) {
|
||||
JPAQuery<T> q = fetchProvider.get().offset(query.getOffset()).limit(query.getLimit());
|
||||
for (QuerySortOrder order : query.getSortOrders()) {
|
||||
Expression<? extends Comparable> sort = sortOptions.get(order.getSorted());
|
||||
if (sort != null) {
|
||||
q = q.orderBy(new OrderSpecifier<>(order.getDirection() == SortDirection.ASCENDING ? Order.ASC : Order.DESC, sort));
|
||||
if(order instanceof QueryDslSortOrder) {
|
||||
q = q.orderBy(((QueryDslSortOrder) order).toSpecifier());
|
||||
}
|
||||
}
|
||||
return q.fetch().stream();
|
||||
|
@ -81,13 +63,19 @@ public class QueryDslDataProvider<T> extends AbstractBackEndDataProvider<T, Void
|
|||
|
||||
@Override
|
||||
protected int sizeInBackEnd(Query<T, Void> query) {
|
||||
int result = Math.toIntExact(countProvider.get().fetchCount());
|
||||
sizeListeners.forEach(listener -> listener.sizeChanged(result));
|
||||
return result;
|
||||
return Math.toIntExact(countProvider.get().fetchCount());
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface SizeListener {
|
||||
void sizeChanged(int size);
|
||||
public static class QueryDslSortOrder extends QuerySortOrder {
|
||||
private final Expression<? extends Comparable> expression;
|
||||
|
||||
public QueryDslSortOrder(@NonNull Expression<? extends Comparable> expression, @NonNull SortDirection direction) {
|
||||
super(expression.toString(), direction);
|
||||
this.expression = expression;
|
||||
}
|
||||
|
||||
public OrderSpecifier<?> toSpecifier() {
|
||||
return new OrderSpecifier<>(getDirection() == SortDirection.ASCENDING ? Order.ASC : Order.DESC, expression);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* @author lukas
|
||||
|
@ -91,7 +92,7 @@ public class MyGrid<T> extends Composite<Grid<T>> implements LocaleChangeObserve
|
|||
}
|
||||
|
||||
private Grid.Column<T> setupSortableColumn(@NonNull Grid.Column<T> column, @NonNull Expression<? extends Comparable> sort) {
|
||||
column.setId(dataProvider.addSortable(sort));
|
||||
column.setSortOrderProvider(direction -> Stream.of(new QueryDslDataProvider.QueryDslSortOrder(sort, direction)));
|
||||
column.setSortable(true);
|
||||
return column;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue