11package edu .tamu .app .model .repo .specification ;
22
33import java .util .ArrayList ;
4+ import java .util .HashMap ;
45import java .util .List ;
56import java .util .Map ;
7+ import java .util .Optional ;
68
79import javax .persistence .criteria .CriteriaBuilder ;
810import 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