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.CriteriaBuilder;
|
import javax.persistence.criteria.CriteriaQuery;
|
import javax.persistence.criteria.Predicate;
|
import javax.persistence.criteria.Root;
|
import java.util.*;
|
|
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<>();
|
|
if(StringUtils.isNotEmpty(param.getCommunicationStyle())) {
|
set.add(criteriaBuilder.like(root.get("concept"), "%" + param.getCommunicationStyle()));
|
}
|
|
if(Objects.nonNull(param.getGender())) {
|
set.add(criteriaBuilder.equal(root.get("gender"), param.getGender()));
|
}
|
|
if(Objects.nonNull(param.getAvgScore())) {
|
set.add(criteriaBuilder.between(root.get("avgScore"), param.getAvgScore().intValue() - 1, param.getAvgScore().intValue() + 1));
|
}
|
|
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(Objects.nonNull(param.getAvgScore())) {
|
set.add(criteriaBuilder.between(root.get("avgScore"), param.getAvgScore().intValue() - 1, param.getAvgScore().intValue() + 1));
|
}
|
|
if(StringUtils.isNotEmpty(param.getArea())) {
|
set.add(criteriaBuilder.like(root.get("serveArea"), "%" + param.getArea() + "%"));
|
}
|
|
List<String> allRequirements = Objects.nonNull(param.getRequirements()) ? param.getRequirements() : new ArrayList<>();
|
if(Objects.nonNull(param.getOtherRequirement())) {
|
allRequirements.add(param.getOtherRequirement());
|
}
|
allRequirements.forEach(requirement -> set.add(criteriaBuilder.like(root.get("expertise"), "%" + requirement + "%")));
|
|
List<String> allPopularTags = Objects.nonNull(param.getPopularTags()) ? param.getPopularTags() : new ArrayList<>();
|
if(Objects.nonNull(param.getOtherPopularTags())) {
|
allPopularTags.add(param.getOtherPopularTags());
|
}
|
allPopularTags.forEach(popularTag -> set.add(criteriaBuilder.like(root.get("concept"), "%" + popularTag + "%")));
|
|
Predicate[] predicates = new Predicate[set.size()];
|
predicates = set.toArray(predicates);
|
return criteriaBuilder.and(predicates);
|
}
|
};
|
}
|
}
|