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

paa.coder.noodleCriteriaBuilder.queryBuilder.specifications.FieldToFieldSpecification Maven / Gradle / Ivy

package paa.coder.noodleCriteriaBuilder.queryBuilder.specifications;

import paa.coder.noodleCriteriaBuilder.interfaces.NoodleExpression;
import paa.coder.noodleCriteriaBuilder.interfaces.PathFinder;
import paa.coder.noodleCriteriaBuilder.queryBuilder.expressions.SampleColumn;

import javax.persistence.criteria.*;
import java.util.Optional;

public class FieldToFieldSpecification extends NoodleSpecification {

    private final NoodleExpression left;
    private final NoodleExpression right;

    public FieldToFieldSpecification(String left, String operator, String right, Boolean isNot){
        this( SampleColumn.build(left, null), operator, right, isNot);
    }

    public FieldToFieldSpecification(NoodleExpression left, String operator, String right, Boolean isNot){
        super(operator, isNot);
        this.left = left;
        this.right = SampleColumn.build(right, null);
    }

    private Predicate toStringPredicate(Expression left, Expression right, CriteriaBuilder b){
        return toStringExpression(left, right, b);
    }

    private > Predicate toComparablePredicate(Expression left,Expression right,CriteriaBuilder b){
        return toComparableExpression(left, right, b);
    }
    private  Predicate toEqualsPredicate(Expression left,Expression right,CriteriaBuilder b) {
        return toEqualsExpression(left,right,b);
    }

    @Override
    public Predicate apply(PathFinder pathFinder, CommonAbstractCriteria query, CriteriaBuilder criteriaBuilder){

        Predicate predicate = Optional
                .ofNullable(left)
                .flatMap(i->i.apply(pathFinder,query,criteriaBuilder))
                .flatMap(left -> Optional
                        .ofNullable(right)
                        .flatMap(_i->_i.apply(pathFinder,query,criteriaBuilder))
                        .filter(right->left.getJavaType().isAssignableFrom(right.getJavaType()))
                        .map(right -> {
                            if(String.class.isAssignableFrom(left.getJavaType())){
                                return toStringPredicate((Expression) left, (Expression) right, criteriaBuilder);
                            }else if(Comparable.class.isAssignableFrom(left.getJavaType())){
                                return toComparablePredicate((Expression)left,(Expression)right, criteriaBuilder);
                            }else{
                                return toEqualsPredicate(left,right, criteriaBuilder);
                            }
                        }))
                .orElse(null);

        return predicate == null ? null : isNot ? predicate.not() : predicate;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy