PathStringSearchPredicateCreator.java
2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package fi.codecrew.moya.facade.callbacks;
import java.util.Collections;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
import fi.codecrew.moya.utilities.jpa.ModelInterface;
public abstract class PathStringSearchPredicateCreator<T extends ModelInterface, D extends ModelInterface> implements FacadeCallback<T> {
private static final String WILDCARD = "%";
private String searchstr = null;
private List<SingularAttribute<D, String>> attributes = null;
public PathStringSearchPredicateCreator(String search, List<SingularAttribute<D, String>> attrs) {
if (addSearch(search)) {
attributes = attrs;
}
}
public PathStringSearchPredicateCreator(String search, SingularAttribute<D, String> from) {
if (addSearch(search)) {
attributes = Collections.singletonList(from);
}
}
private boolean addSearch(String search) {
if (search != null) {
search = search.trim().toLowerCase();
if (!search.isEmpty()) {
searchstr = new StringBuilder().append(WILDCARD).append(search).append(WILDCARD).toString();
return true;
}
}
searchstr = null;
return false;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> path, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) {
return;
}
Path<D> entityPath = getPath(path);
for (String splitSearch : searchstr.split(" "))
{
splitSearch = splitSearch.trim();
if (splitSearch.isEmpty())
continue;
splitSearch = new StringBuilder().append(WILDCARD).append(splitSearch).append(WILDCARD).toString();
Predicate[] preds = new Predicate[attributes.size()];
int i = 0;
for (SingularAttribute<D, String> attr : attributes) {
preds[i++] = cb.like(cb.lower(entityPath.get(attr)), splitSearch);
}
predicates.add(cb.or(preds));
}
}
protected abstract Path<D> getPath(Path<T> root);
}