Skip to content

Commit e83b4d5

Browse files
fix: apply any prefiltering specification to the search panes
This was broken in [1], due to the creation of a new specification without the fetch clauses. [1]: d4c810e
1 parent 8345740 commit e83b4d5

File tree

3 files changed

+29
-40
lines changed

3 files changed

+29
-40
lines changed

src/main/java/org/springframework/data/jpa/datatables/SpecificationBuilder.java

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@ public Predicate toPredicate(@NonNull Root<S> root, @NonNull CriteriaQuery<?> qu
3636
return predicates.toPredicate(criteriaBuilder);
3737
}
3838

39-
private boolean isCountQuery(CriteriaQuery<?> query) {
39+
private static boolean isCountQuery(CriteriaQuery<?> query) {
4040
return query.getResultType() == Long.class;
4141
}
4242

43-
protected void initPredicatesRecursively(Predicates predicates, CriteriaQuery<?> query, Node<Filter> node, From<S, S> from, FetchParent<S, S> fetch, CriteriaBuilder criteriaBuilder) {
43+
private static boolean isAggregateQuery(CriteriaQuery<?> query) {
44+
return query.getGroupList().size() > 0;
45+
}
46+
47+
private void initPredicatesRecursively(Predicates predicates, CriteriaQuery<?> query, Node<Filter> node, From<S, S> from, FetchParent<S, S> fetch, CriteriaBuilder criteriaBuilder) {
4448
if (node.isLeaf()) {
4549
boolean hasColumnFilter = node.getData() != null;
4650
if (hasColumnFilter) {
@@ -62,7 +66,7 @@ protected void initPredicatesRecursively(Predicates predicates, CriteriaQuery<?>
6266
} else {
6367
Join<S, S> join = from.join(child.getName(), JoinType.LEFT);
6468

65-
if (isCountQuery(query)) {
69+
if (isCountQuery(query) || isAggregateQuery(query)) {
6670
initPredicatesRecursively(predicates, query, child, join, join, criteriaBuilder);
6771
} else {
6872
Fetch<S, S> childFetch = fetch.fetch(child.getName(), JoinType.LEFT);
@@ -73,41 +77,6 @@ protected void initPredicatesRecursively(Predicates predicates, CriteriaQuery<?>
7377
}
7478
}
7579

76-
private class DataTablesSearchPaneSpecification<S> extends DataTablesSpecification<S> {
77-
78-
@Override
79-
protected void initPredicatesRecursively(Predicates predicates, CriteriaQuery<?> query, Node<Filter> node, From<S, S> from,
80-
FetchParent<S, S> fetch, CriteriaBuilder criteriaBuilder) {
81-
if (node.isLeaf()) {
82-
boolean hasColumnFilter = node.getData() != null;
83-
if (hasColumnFilter) {
84-
Filter columnFilter = node.getData();
85-
predicates.columns.add(columnFilter.createPredicate(from, criteriaBuilder, node.getName()));
86-
} else if (hasGlobalFilter) {
87-
Filter globalFilter = tree.getData();
88-
predicates.global.add(globalFilter.createPredicate(from, criteriaBuilder, node.getName()));
89-
}
90-
}
91-
for (Node<Filter> child : node.getChildren()) {
92-
Path<Object> path = from.get(child.getName());
93-
if (path.getModel().getBindableType() == BindableType.PLURAL_ATTRIBUTE) {
94-
// ignore OneToMany and ManyToMany relationships
95-
continue;
96-
}
97-
if (child.isLeaf()) {
98-
initPredicatesRecursively(predicates, query, child, from, fetch, criteriaBuilder);
99-
} else {
100-
Join<S, S> join = from.join(child.getName(), JoinType.LEFT);
101-
initPredicatesRecursively(predicates, query, child, join, fetch, criteriaBuilder);
102-
}
103-
}
104-
}
105-
}
106-
107-
public Specification<T> buildSearchPane() {
108-
return new DataTablesSearchPaneSpecification<>();
109-
}
110-
11180
private static class Predicates {
11281
public List<Predicate> columns = new ArrayList<>();
11382
public List<Predicate> global = new ArrayList<>();

src/main/java/org/springframework/data/jpa/datatables/repository/DataTablesRepositoryImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ public <R> DataTablesOutput<R> findAll(DataTablesInput input,
9191
output.setRecordsFiltered(data.getTotalElements());
9292

9393
if (input.getSearchPanes() != null) {
94-
SpecificationBuilder<T> specificationSearchPaneBuilder = new SpecificationBuilder<>(input);
95-
output.setSearchPanes(computeSearchPanes(input, specificationSearchPaneBuilder.buildSearchPane()));
94+
output.setSearchPanes(computeSearchPanes(input, specification));
9695
}
9796
} catch (Exception e) {
9897
log.warn("error while fetching records", e);

src/test/java/org/springframework/data/jpa/datatables/repository/EmployeeRepositoryTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,27 @@ void withSearchPanes() {
294294
);
295295
}
296296

297+
@Test
298+
void withSearchPanesAndAPreFilteringSpecification() {
299+
Map<String, Set<String>> searchPanes = new HashMap<>();
300+
searchPanes.put("position", new HashSet<>(asList("Software Engineer", "Integration Specialist")));
301+
searchPanes.put("age", emptySet());
302+
303+
input.setSearchPanes(searchPanes);
304+
305+
DataTablesOutput<Employee> output = employeeRepository.findAll(input, null, new SoftwareEngineersOnly<>());
306+
assertThat(output.getRecordsFiltered()).isEqualTo(2);
307+
assertThat(output.getSearchPanes()).isNotNull();
308+
309+
assertThat(output.getSearchPanes().getOptions().get("position")).containsOnly(
310+
new SearchPanes.Item("Software Engineer", "Software Engineer", 2, 2)
311+
);
312+
assertThat(output.getSearchPanes().getOptions().get("age")).containsOnly(
313+
new SearchPanes.Item("28", "28", 1, 1),
314+
new SearchPanes.Item("41", "41", 1, 1)
315+
);
316+
}
317+
297318
private static DataTablesInput getBasicInput() {
298319
DataTablesInput input = new DataTablesInput();
299320
input.addColumn("id", true, true, "");

0 commit comments

Comments
 (0)