Skip to content

Commit 83d770a

Browse files
LegiothArtur-
authored andcommitted
Add fluent builder (#3)
1 parent c72b49e commit 83d770a

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.vaadin.artur.spring.dataprovider;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.function.BiFunction;
6+
import java.util.function.ToLongFunction;
7+
8+
import org.springframework.data.domain.Page;
9+
import org.springframework.data.domain.Pageable;
10+
import org.springframework.data.repository.PagingAndSortingRepository;
11+
12+
import com.vaadin.data.provider.ConfigurableFilterDataProvider;
13+
import com.vaadin.data.provider.DataProvider;
14+
import com.vaadin.data.provider.Query;
15+
import com.vaadin.data.provider.QuerySortOrder;
16+
import com.vaadin.data.provider.SortDirection;
17+
18+
public class SpringDataProviderBuilder<T, F> {
19+
private final BiFunction<Pageable, F, Page<T>> queryFunction;
20+
private final ToLongFunction<F> lengthFunction;
21+
private final List<QuerySortOrder> defaultSortOrders = new ArrayList<>();
22+
23+
private F defaultFilter = null;
24+
25+
public SpringDataProviderBuilder(
26+
BiFunction<Pageable, F, Page<T>> queryFunction,
27+
ToLongFunction<F> lengthFunction) {
28+
this.queryFunction = queryFunction;
29+
this.lengthFunction = lengthFunction;
30+
}
31+
32+
public SpringDataProviderBuilder<T, F> withDefaultSort(String column,
33+
SortDirection direction) {
34+
defaultSortOrders.add(new QuerySortOrder(column, direction));
35+
return this;
36+
}
37+
38+
public SpringDataProviderBuilder<T, F> withDefaultFilter(F defaultFilter) {
39+
this.defaultFilter = defaultFilter;
40+
return this;
41+
}
42+
43+
public DataProvider<T, F> build() {
44+
return new PageableDataProvider<T, F>() {
45+
@Override
46+
protected Page<T> fetchFromBackEnd(Query<T, F> query,
47+
Pageable pageable) {
48+
return queryFunction.apply(pageable,
49+
query.getFilter().orElse(defaultFilter));
50+
}
51+
52+
@Override
53+
protected List<QuerySortOrder> getDefaultSortOrders() {
54+
return defaultSortOrders;
55+
}
56+
57+
@Override
58+
protected int sizeInBackEnd(Query<T, F> query) {
59+
return (int) lengthFunction
60+
.applyAsLong(query.getFilter().orElse(defaultFilter));
61+
}
62+
};
63+
}
64+
65+
public ConfigurableFilterDataProvider<T, Void, F> buildFilterable() {
66+
return build().withConfigurableFilter();
67+
}
68+
69+
public static <T> SpringDataProviderBuilder<T, Void> forRepository(
70+
PagingAndSortingRepository<T, ?> repository) {
71+
return new SpringDataProviderBuilder<>(
72+
(pageable, filter) -> repository.findAll(pageable),
73+
filter -> repository.count());
74+
}
75+
76+
public static <T, F> SpringDataProviderBuilder<T, F> forFunctions(
77+
BiFunction<Pageable, F, Page<T>> queryFunction,
78+
ToLongFunction<F> lengthFunction) {
79+
return new SpringDataProviderBuilder<>(queryFunction, lengthFunction);
80+
}
81+
}

0 commit comments

Comments
 (0)