package com.pollex.pam.service;
|
|
import com.pollex.pam.domain.Consultant;
|
import com.pollex.pam.service.dto.FastQueryConsultantParam;
|
import com.pollex.pam.service.dto.StrictQueryConsultantParam;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.data.jpa.domain.Specification;
|
|
import javax.persistence.criteria.*;
|
import java.util.*;
|
|
import static com.pollex.pam.consts.SeniorityQueryConst.*;
|
|
public class ConsultantQuerySpec {
|
private ConsultantQuerySpec() {
|
}
|
|
public static Specification<Consultant> getFastQuerySpec(FastQueryConsultantParam param) {
|
return new Specification<Consultant>() {
|
@SuppressWarnings("FieldNameHidesFieldInSuperclass")
|
private static final long serialVersionUID = 6644524130903161741L;
|
|
@Override
|
public Predicate toPredicate(Root<Consultant> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
|
Set<Predicate> set = new HashSet<>();
|
|
param.getCommunicationStyles().forEach((communicationStyle) -> {
|
set.add(criteriaBuilder.like(root.get("communicationStyle"), "%" + communicationStyle + "%"));
|
});
|
|
if(Objects.nonNull(param.getGender())) {
|
set.add(criteriaBuilder.equal(root.get("gender"), param.getGender()));
|
}
|
|
if(Objects.nonNull(param.getAvgScore()) && param.getAvgScore().intValue() != 0) {
|
set.add(criteriaBuilder.greaterThanOrEqualTo(root.get("avgScore"), param.getAvgScore().intValue()));
|
}
|
|
if(StringUtils.isNotEmpty(param.getSeniority()) && !StringUtils.equals(UNLIMITED, param.getSeniority())) {
|
if(YOUNG.equals(param.getSeniority())) {
|
set.add(criteriaBuilder.lessThanOrEqualTo(root.get("seniorityYear"), 5));
|
}
|
else if(SENIOR.equals(param.getSeniority())) {
|
set.add(criteriaBuilder.greaterThan(root.get("seniorityYear"), 5));
|
}
|
}
|
|
Predicate[] predicates = new Predicate[set.size()];
|
predicates = set.toArray(predicates);
|
return criteriaBuilder.and(predicates);
|
}
|
};
|
}
|
|
public static Specification<Consultant> getStrictQuerySpec(StrictQueryConsultantParam param) {
|
return new Specification<Consultant>() {
|
@SuppressWarnings("FieldNameHidesFieldInSuperclass")
|
private static final long serialVersionUID = 664452413090316174L;
|
|
@Override
|
public Predicate toPredicate(Root<Consultant> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
|
Set<Predicate> set = new HashSet<>();
|
|
if(Objects.nonNull(param.getGender())) {
|
set.add(criteriaBuilder.equal(root.get("gender"), param.getGender()));
|
}
|
|
if(StringUtils.isNotEmpty(param.getArea())) {
|
set.add(criteriaBuilder.like(root.get("serveArea"), "%" + param.getArea() + "%"));
|
}
|
|
Predicate[] predicates = new Predicate[set.size()];
|
predicates = set.toArray(predicates);
|
return criteriaBuilder.and(predicates);
|
}
|
};
|
}
|
}
|