Skip to content

Commit 1fa4387

Browse files
authored
Merge pull request #46 from TAMULib/sprint4-specification
redesigned specification
2 parents 666c1d7 + c8c5e5e commit 1fa4387

1 file changed

Lines changed: 33 additions & 31 deletions

File tree

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package edu.tamu.app.model.repo.specification;
22

33
import java.util.ArrayList;
4+
import java.util.HashMap;
45
import java.util.List;
56
import java.util.Map;
7+
import java.util.Optional;
68

79
import javax.persistence.criteria.CriteriaBuilder;
810
import javax.persistence.criteria.CriteriaQuery;
@@ -22,10 +24,7 @@ public AbstractSpecification(Map<String, String[]> filters) {
2224
@Override
2325
public Predicate toPredicate(Root<E> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
2426

25-
List<Predicate> predicates = new ArrayList<Predicate>();
26-
List<Predicate> repeatPredicates = new ArrayList<Predicate>();
27-
28-
List<String> keysUsed = new ArrayList<String>();
27+
PredicateBuilder builder = new PredicateBuilder();
2928

3029
for (Map.Entry<String, String[]> entry : filters.entrySet()) {
3130
String key = entry.getKey();
@@ -34,51 +33,54 @@ public Predicate toPredicate(Root<E> root, CriteriaQuery<?> query, CriteriaBuild
3433
switch (key) {
3534
case "service":
3635
for (String value : values) {
37-
if (keysUsed.contains(key)) {
38-
repeatPredicates.add(cb.like(cb.lower(root.get(key).get("id").as(String.class)), "%" + value.toLowerCase() + "%"));
39-
} else {
40-
predicates.add(cb.like(cb.lower(root.get(key).get("id").as(String.class)), "%" + value.toLowerCase() + "%"));
41-
keysUsed.add(key);
42-
}
36+
builder.addPredicate(key, cb.like(cb.lower(root.get(key).get("id").as(String.class)), "%" + value.toLowerCase() + "%"));
4337
}
4438
break;
4539
case "service.name":
4640
for (String value : values) {
47-
if (keysUsed.contains(key)) {
48-
repeatPredicates.add(cb.like(cb.lower(root.get("service").get("name").as(String.class)), "%" + value.toLowerCase() + "%"));
49-
} else {
50-
predicates.add(cb.like(cb.lower(root.get("service").get("name").as(String.class)), "%" + value.toLowerCase() + "%"));
51-
keysUsed.add(key);
52-
}
41+
builder.addPredicate(key, cb.like(cb.lower(root.get("service").get("name").as(String.class)), "%" + value.toLowerCase() + "%"));
5342
}
5443
break;
5544
default:
5645
for (String value : values) {
57-
if (keysUsed.contains(key)) {
58-
repeatPredicates.add(cb.like(cb.lower(root.get(key).as(String.class)), "%" + value.toLowerCase() + "%"));
59-
} else {
60-
predicates.add(cb.like(cb.lower(root.get(key).as(String.class)), "%" + value.toLowerCase() + "%"));
61-
keysUsed.add(key);
62-
}
63-
46+
builder.addPredicate(key, cb.like(cb.lower(root.get(key).as(String.class)), "%" + value.toLowerCase() + "%"));
6447
}
6548
break;
6649
}
67-
68-
keysUsed.add(key);
6950
}
7051

7152
query.orderBy(cb.desc(root.get("lastModified")));
7253

73-
Predicate predicate;
54+
return builder.build(cb);
55+
}
7456

75-
if (repeatPredicates.size() > 0) {
76-
predicate = cb.or(cb.and(predicates.toArray(new Predicate[predicates.size()])), cb.or(repeatPredicates.toArray(new Predicate[repeatPredicates.size()])));
77-
} else {
78-
predicate = cb.and(predicates.toArray(new Predicate[predicates.size()]));
57+
private class PredicateBuilder {
58+
59+
private final Map<String, List<Predicate>> predicates;
60+
61+
public PredicateBuilder() {
62+
this.predicates = new HashMap<String, List<Predicate>>();
63+
}
64+
65+
public void addPredicate(String key, Predicate predicate) {
66+
List<Predicate> predicates = getPredicates(key);
67+
predicates.add(predicate);
68+
this.predicates.put(key, predicates);
69+
}
70+
71+
public List<Predicate> getPredicates(String key) {
72+
Optional<List<Predicate>> potentialPredicates = Optional.ofNullable(this.predicates.get(key));
73+
return potentialPredicates.isPresent() ? potentialPredicates.get() : new ArrayList<Predicate>();
74+
}
75+
76+
public Predicate build(CriteriaBuilder cb) {
77+
List<Predicate> columnPredicates = new ArrayList<Predicate>();
78+
for (List<Predicate> predicates : this.predicates.values()) {
79+
columnPredicates.add(cb.or(predicates.toArray(new Predicate[predicates.size()])));
80+
}
81+
return cb.and(columnPredicates.toArray(new Predicate[columnPredicates.size()]));
7982
}
8083

81-
return predicate;
8284
}
8385

8486
}

0 commit comments

Comments
 (0)