
paa.coder.noodleCriteriaBuilder.queryBuilder.specifications.SubquerySpecification Maven / Gradle / Ivy
package paa.coder.noodleCriteriaBuilder.queryBuilder.specifications;
import paa.coder.noodleCriteriaBuilder.exceptions.ComparisonOperatorsNotSupport;
import paa.coder.noodleCriteriaBuilder.interfaces.PathFinder;
import paa.coder.noodleCriteriaBuilder.queryBuilder.SubqueryBuilder;
import javax.persistence.criteria.*;
import java.util.function.Supplier;
public abstract class SubquerySpecification extends NoodleSpecification{
private final SubqueryBuilder queryBuilder;
public SubquerySpecification(SubqueryBuilder queryBuilder,String operator, Boolean isNot){
super(operator, isNot);
this.queryBuilder = queryBuilder;
}
protected Predicate toStringPredicate(Expression path,CommonAbstractCriteria criteriaQuery,PathFinder pathFinder,CriteriaBuilder b){
return toStringExpression(path, (Expression) createQuery(path, criteriaQuery, pathFinder), b);
}
protected > Predicate toComparablePredicate(Expression path,CommonAbstractCriteria criteriaQuery,PathFinder pathFinder,CriteriaBuilder b){
return toComparableExpression(path, createQuery(path, criteriaQuery, pathFinder), b);
}
protected Predicate toEqualsPredicate(Expression path,CommonAbstractCriteria criteriaQuery,PathFinder pathFinder,CriteriaBuilder b) {
return toEqualsExpression(path,createQuery(path, criteriaQuery, pathFinder),b);
}
protected Predicate toPredicateInList(Expression extends X> path, Subquery extends X> value, CriteriaBuilder b){
if(value==null){
return b.isNull(path);
}
Supplier in = () -> path.in(value);
switch(operator.toUpperCase().trim()){
case "IN":{
return in.get();
}
case "NOT IN":{
return in.get().not();
}
}
throw new ComparisonOperatorsNotSupport("operator for collection must be in ['IN' ,'NOT IN']");
}
protected Subquery extends X> createQuery(Expression path,CommonAbstractCriteria criteriaQuery,PathFinder pathFinder){
Class extends X> pathType = path.getJavaType();
return new SubqueryBuilder.NoodleSubquery<>(queryBuilder,pathFinder,criteriaQuery.subquery(pathType)).build();
}
protected abstract Expression> getExpression(PathFinder pathFinder, CommonAbstractCriteria criteriaQuery, CriteriaBuilder criteriaBuilder);
@Override
public Predicate apply(PathFinder pathFinder, CommonAbstractCriteria criteriaQuery, CriteriaBuilder criteriaBuilder){
Expression> path = getExpression(pathFinder,criteriaQuery,criteriaBuilder);
Predicate predicate;
if(isIterable()){
predicate = toPredicateInList(path, createQuery(path,criteriaQuery,pathFinder), criteriaBuilder);
}else{
if(String.class.isAssignableFrom(path.getJavaType())){
predicate = toStringPredicate((Expression) path,criteriaQuery,pathFinder, criteriaBuilder);
}else if(Comparable.class.isAssignableFrom(path.getJavaType())){
predicate = toComparablePredicate((Expression)path,criteriaQuery,pathFinder, criteriaBuilder);
}else{
predicate = toEqualsPredicate(path,criteriaQuery,pathFinder, criteriaBuilder);
}
}
return isNot ? predicate.not() : predicate;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy