All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 path, Subquery 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 createQuery(Expression path,CommonAbstractCriteria criteriaQuery,PathFinder pathFinder){
        Class 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