/*
* Copyright 2013 uaiHebert Solucoes em Informatica
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* */
package com.uaihebert.uaicriteria.predicate;
import com.uaihebert.uaicriteria.subquery.SubQueryImp;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
public final class RegularQueryPredicateCreator extends AbstractPredicateCreator {
private RegularQueryPredicateCreator() {
super();
}
public static Predicate createEqualPredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Path path, final Object value) {
if (toLowerCase) {
final String valueAsString = (String) value;
final Expression<String> lower = criteriaBuilder.lower(path);
return criteriaBuilder.equal(lower, valueAsString.toLowerCase());
}
return criteriaBuilder.equal(path, value);
}
public static <Y extends Comparable<? super Y>> Predicate createGreaterThanPredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Expression<? extends Y> path, final Y value) {
if (toLowerCase) {
final String loweredValue = createLoweredValue(value);
final Expression<String> loweredExpression = createLoweredExpression(criteriaBuilder, path);
return criteriaBuilder.greaterThan(loweredExpression, loweredValue);
}
return criteriaBuilder.greaterThan(path, value);
}
public static <Y extends Comparable<? super Y>> Predicate createGreaterOrEqualToPredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Expression<? extends Y> path, final Y value) {
if (toLowerCase) {
final String loweredValue = createLoweredValue(value);
final Expression<String> loweredExpression = createLoweredExpression(criteriaBuilder, path);
return criteriaBuilder.greaterThanOrEqualTo(loweredExpression, loweredValue);
}
return criteriaBuilder.greaterThanOrEqualTo(path, value);
}
public static <Y extends Comparable<? super Y>> Predicate createLessThanPredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Expression<? extends Y> path, final Y value) {
if (toLowerCase) {
final String loweredValue = createLoweredValue(value);
final Expression<String> loweredExpression = createLoweredExpression(criteriaBuilder, path);
return criteriaBuilder.lessThan(loweredExpression, loweredValue);
}
return criteriaBuilder.lessThan(path, value);
}
public static <Y extends Comparable<? super Y>> Predicate createLessOrEqualToPredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Expression<? extends Y> path, final Y value) {
if (toLowerCase) {
final String loweredValue = createLoweredValue(value);
final Expression<String> loweredExpression = createLoweredExpression(criteriaBuilder, path);
return criteriaBuilder.lessThanOrEqualTo(loweredExpression, loweredValue);
}
return criteriaBuilder.lessThanOrEqualTo(path, value);
}
public static Predicate createIsNullPredicate(final CriteriaBuilder criteriaBuilder, final Path path) {
return criteriaBuilder.isNull(path);
}
public static Predicate createIsEmptyPredicate(final CriteriaBuilder criteriaBuilder, final Path path) {
return criteriaBuilder.isEmpty(path);
}
public static Predicate createLikePredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Path path, final String value) {
if (toLowerCase) {
final String loweredValue = createLoweredValue(value);
final Expression<String> loweredExpression = createLoweredExpression(criteriaBuilder, path);
return criteriaBuilder.like(loweredExpression, loweredValue);
}
return criteriaBuilder.like(path, value);
}
public static Predicate createStringInPredicate(final boolean toLowerCase, final CriteriaBuilder criteriaBuilder, final Path path, final List<String> valueList) {
if (toLowerCase) {
final List<String> loweredList = new ArrayList<String>();
for (final String value : valueList) {
loweredList.add(value.toLowerCase());
}
final Expression<String> loweredExpression = createLoweredExpression(criteriaBuilder, path);
return loweredExpression.in(loweredList);
}
return path.in(valueList);
}
public static Predicate createAndIsMemberOf(final CriteriaBuilder criteriaBuilder, final Path path, final Object value) {
return criteriaBuilder.isMember(value, path);
}
public static <E> Predicate createAttributeInPredicate(final Path path, final List<E> attributeList) {
return path.in(attributeList);
}
public static Predicate createAttributeInPredicate(final CriteriaBuilder criteriaBuilder, final Path path, final SubQueryImp uaiSubQuery) {
uaiSubQuery.prepareSubQuery();
return criteriaBuilder.in(path).value(uaiSubQuery.getSubQuery());
}
}