/* * 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.path; import com.uaihebert.uaicriteria.base.element.BaseCriteria; import com.uaihebert.uaicriteria.criteria.CriteriaOrType; import com.uaihebert.uaicriteria.criteria.CriteriaResultOrderBy; import com.uaihebert.uaicriteria.predicate.RegularQueryPredicateCreator; import com.uaihebert.uaicriteria.subquery.SubQueryImp; import com.uaihebert.util.ReflectionUtil; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Order; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import java.util.List; public final class RegularQueryPathCreator extends AbstractPathCreator { private static final boolean FETCH_ENABLED = true; private static final boolean FETCH_DISABLED = false; private RegularQueryPathCreator() { } public static void andEquals(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate equal = RegularQueryPredicateCreator.createEqualPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value); finishWithAndPredicate(baseCriteria, equal); } public static void andNotEquals(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate notEqualsPredicate = RegularQueryPredicateCreator.createEqualPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value).not(); finishWithAndPredicate(baseCriteria, notEqualsPredicate); } public static void innerJoin(final String joinName, final BaseCriteria baseCriteria) { PathHelper.createJoinPaths(baseCriteria, joinName, JoinType.INNER, FETCH_DISABLED); } public static void innerJoinFetch(final String joinName, final BaseCriteria baseCriteria) { PathHelper.createJoinPaths(baseCriteria, joinName, JoinType.INNER, FETCH_ENABLED); } public static void leftJoinFetch(final String joinName, final BaseCriteria baseCriteria) { PathHelper.createJoinPaths(baseCriteria, joinName, JoinType.LEFT, FETCH_ENABLED); } public static void leftJoin(final String joinName, final BaseCriteria baseCriteria) { PathHelper.createJoinPaths(baseCriteria, joinName, JoinType.LEFT, FETCH_DISABLED); } public static void orderBy(final String attributeName, final BaseCriteria baseCriteria, final CriteriaResultOrderBy criteriaResultOrderBy) { final CriteriaBuilder criteriaBuilder = baseCriteria.getCriteriaBuilder(); final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Order currentOrdination = criteriaResultOrderBy.createOrdination(path, criteriaBuilder); baseCriteria.addOrdination(currentOrdination); } public static void andHint(final BaseCriteria baseCriteria, final String key, final String value) { baseCriteria.addHint(key, value); } public static void addOr(final boolean toLowerCase, final int index, final BaseCriteria baseCriteria, final String attributeName, final Object[] valueArray, final CriteriaOrType orType) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); if (valueArray == null) { final Predicate predicate = createEqualForOr(toLowerCase, baseCriteria, path, null, orType); final Predicate andPredicate = createAndPredicate(baseCriteria, predicate); baseCriteria.addOrPredicate(index, andPredicate); return; } for (final Object value : valueArray) { final Predicate predicate = createEqualForOr(toLowerCase, baseCriteria, path, value, orType); final Predicate andPredicate = createAndPredicate(baseCriteria, predicate); baseCriteria.addOrPredicate(index, andPredicate); } } private static Predicate createEqualForOr(final boolean toLowerCase, final BaseCriteria baseCriteria, final Path path, final Object value, final CriteriaOrType orType) { if (CriteriaOrType.LIKE.equals(orType)) { return RegularQueryPredicateCreator.createLikePredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value.toString()); } if (CriteriaOrType.NOT_LIKE.equals(orType)) { final Predicate predicate = RegularQueryPredicateCreator.createLikePredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value.toString()); return predicate.not(); } if (CriteriaOrType.IS_NULL.equals(orType)) { return RegularQueryPredicateCreator.createIsNullPredicate(baseCriteria.getCriteriaBuilder(), path); } if (CriteriaOrType.IS_NOT_NULL.equals(orType)) { final Predicate isNullPredicate = RegularQueryPredicateCreator.createIsNullPredicate(baseCriteria.getCriteriaBuilder(), path); return isNullPredicate.not(); } return RegularQueryPredicateCreator.createEqualPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value); } public static void addAndSeparatedByOr(final boolean toLowerCase, final int index, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate predicate = RegularQueryPredicateCreator.createEqualPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value); final Predicate andPredicate = createAndPredicate(baseCriteria, predicate); baseCriteria.addAndSeparatedByOr(index, andPredicate); } public static void andIsMemberOf(final BaseCriteria baseCriteria, final String collectionName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, collectionName); final Predicate predicate = RegularQueryPredicateCreator.createAndIsMemberOf(baseCriteria.getCriteriaBuilder(), path, value); final Predicate andPredicate = createAndPredicate(baseCriteria, predicate); baseCriteria.addAndPredicate(andPredicate); } public static void andIsNotMemberOf(final BaseCriteria baseCriteria, final String collectionName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, collectionName); final Predicate predicate = RegularQueryPredicateCreator.createAndIsMemberOf(baseCriteria.getCriteriaBuilder(), path, value); final Predicate notPredicate = predicate.not(); final Predicate andPredicate = createAndPredicate(baseCriteria, notPredicate); baseCriteria.addAndPredicate(andPredicate); } public static void andBetween(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object valueA, final Object valueB) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Comparable typedGreaterThan = getTypedValue(baseCriteria.getEntityClass(), attributeName, valueA); final Predicate equalPredicateA = RegularQueryPredicateCreator.createGreaterOrEqualToPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, typedGreaterThan); final Comparable typedLessOrEqualTo = getTypedValue(baseCriteria.getEntityClass(), attributeName, valueB); final Predicate equalPredicateB = RegularQueryPredicateCreator.createLessOrEqualToPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, typedLessOrEqualTo); finishWithAndPredicate(baseCriteria, equalPredicateA, equalPredicateB); } public static void andGreaterOrEqualTo(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Comparable typedValue = getTypedValue(baseCriteria.getEntityClass(), attributeName, value); final Predicate equalPredicate = RegularQueryPredicateCreator.createGreaterOrEqualToPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, typedValue); finishWithAndPredicate(baseCriteria, equalPredicate); } public static void andLessThan(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Comparable typedValue = getTypedValue(baseCriteria.getEntityClass(), attributeName, value); final Predicate equalPredicate = RegularQueryPredicateCreator.createLessThanPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, typedValue); finishWithAndPredicate(baseCriteria, equalPredicate); } public static void andLessOrEqualTo(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Comparable typedValue = getTypedValue(baseCriteria.getEntityClass(), attributeName, value); final Predicate equalPredicate = RegularQueryPredicateCreator.createLessOrEqualToPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, typedValue); finishWithAndPredicate(baseCriteria, equalPredicate); } public static void andGreaterThan(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Comparable typedValue = getTypedValue(baseCriteria.getEntityClass(), attributeName, value); final Predicate equalPredicate = RegularQueryPredicateCreator.createGreaterThanPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, typedValue); finishWithAndPredicate(baseCriteria, equalPredicate); } public static void orNotEquals(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final Object[] valueArray) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); for (final Object value : valueArray) { final Predicate equalPredicate = RegularQueryPredicateCreator.createEqualPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value); final Predicate notEqualPredicate = equalPredicate.not(); final Predicate andPredicate = createAndPredicate(baseCriteria, notEqualPredicate); baseCriteria.addOrPredicate(BaseCriteria.DEFAULT_OR_PREDICATE_INDEX, andPredicate); } } public static void andIsNull(final BaseCriteria baseCriteria, final String attributeName) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate isNullPredicate = RegularQueryPredicateCreator.createIsNullPredicate(baseCriteria.getCriteriaBuilder(), path); finishWithAndPredicate(baseCriteria, isNullPredicate); } public static void andIsNotNull(final BaseCriteria baseCriteria, final String attributeName) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate isNullPredicate = RegularQueryPredicateCreator.createIsNullPredicate(baseCriteria.getCriteriaBuilder(), path); final Predicate notEqualPredicate = isNullPredicate.not(); finishWithAndPredicate(baseCriteria, notEqualPredicate); } public static void andCollectionIsEmpty(final BaseCriteria baseCriteria, final String collectionName) { if (!ReflectionUtil.isSupportedCollection(baseCriteria.getEntityClass(), collectionName, true)) { throw new IllegalArgumentException("The attribute: " + collectionName + " is not a valid collection. The supported types are: List, Collection, Map or Set"); } final Path path = PathHelper.extractPath(baseCriteria, collectionName); final Predicate isEmptyPredicate = RegularQueryPredicateCreator.createIsEmptyPredicate(baseCriteria.getCriteriaBuilder(), path); finishWithAndPredicate(baseCriteria, isEmptyPredicate); } public static void andCollectionIsNotEmpty(final BaseCriteria baseCriteria, final String collectionName) { if (!ReflectionUtil.isSupportedCollection(baseCriteria.getEntityClass(), collectionName, true)) { throw new IllegalArgumentException("The attribute: " + collectionName + " is not a valid collection. The supported types are: List, Collection, Map or Set"); } final Path path = PathHelper.extractPath(baseCriteria, collectionName); final Predicate isEmptyPredicate = RegularQueryPredicateCreator.createIsEmptyPredicate(baseCriteria.getCriteriaBuilder(), path); final Predicate isNotEmptyPredicate = isEmptyPredicate.not(); finishWithAndPredicate(baseCriteria, isNotEmptyPredicate); } public static void setDistinctTrue(final BaseCriteria baseCriteria) { baseCriteria.setDistinctTrue(); } public static void andStringIn(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final List<String> valueList) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate inPredicate = RegularQueryPredicateCreator.createStringInPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, valueList); finishWithAndPredicate(baseCriteria, inPredicate); } public static void andStringNotIn(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final List<String> valueList) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate inPredicate = RegularQueryPredicateCreator.createStringInPredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, valueList); final Predicate notInPredicate = inPredicate.not(); finishWithAndPredicate(baseCriteria, notInPredicate); } public static void andStringLike(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final String value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate likePredicate = RegularQueryPredicateCreator.createLikePredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value); finishWithAndPredicate(baseCriteria, likePredicate); } public static void andStringNotLike(final boolean toLowerCase, final BaseCriteria baseCriteria, final String attributeName, final String value) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate likePredicate = RegularQueryPredicateCreator.createLikePredicate(toLowerCase, baseCriteria.getCriteriaBuilder(), path, value); final Predicate notLikePredicate = likePredicate.not(); finishWithAndPredicate(baseCriteria, notLikePredicate); } public static <E> void andAttributeIn(final BaseCriteria baseCriteria, final String attributeName, final List<E> attributeList) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate inPredicate = RegularQueryPredicateCreator.createAttributeInPredicate(path, attributeList); finishWithAndPredicate(baseCriteria, inPredicate); } public static void andAttributeIn(final BaseCriteria baseCriteria, final String attributeName, final SubQueryImp uaiSubQuery) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate inPredicate = RegularQueryPredicateCreator.createAttributeInPredicate(baseCriteria.getCriteriaBuilder(), path, uaiSubQuery); finishWithAndPredicate(baseCriteria, inPredicate); } public static void andAttributeNotIn(final BaseCriteria baseCriteria, final String attributeName, final SubQueryImp uaiSubQuery) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate inPredicate = RegularQueryPredicateCreator.createAttributeInPredicate(baseCriteria.getCriteriaBuilder(), path, uaiSubQuery); finishWithAndPredicate(baseCriteria, inPredicate.not()); } public static <E> void andAttributeNotIn(final BaseCriteria baseCriteria, final String attributeName, final List<E> attributeList) { final Path path = PathHelper.extractPath(baseCriteria, attributeName); final Predicate inPredicate = RegularQueryPredicateCreator.createAttributeInPredicate(path, attributeList); final Predicate notInPredicate = inPredicate.not(); finishWithAndPredicate(baseCriteria, notInPredicate); } }