/*
* 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;
import com.uaihebert.uaicriteria.base.element.BasicCriteriaElements;
import com.uaihebert.uaicriteria.base.element.BasicCriteriaElementsFactory;
import com.uaihebert.uaicriteria.criteria.CriteriaCreator;
import com.uaihebert.uaicriteria.criteria.CriteriaOrType;
import com.uaihebert.uaicriteria.criteria.QueryType;
import com.uaihebert.uaicriteria.subquery.SubQueryImp;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import java.util.List;
import java.util.logging.Logger;
public class UaiCriteriaImp<T> implements UaiCriteria<T> {
private static final Logger LOG = Logger.getLogger("uaiCriteria");
private static final boolean DO_NOT_APPLY_LOWER_CASE = false;
private static final String IS_EMPTY_BATOO_MESSAGE = "There is a problem with Batoo and this kind of criteria. Check here for more details: http://stackoverflow.com/questions/24942520/how-to-use-criteria-isempty-with-batto";
private final CriteriaCreator criteriaCreator;
protected final BasicCriteriaElements basicCriteriaElements;
public UaiCriteriaImp(final EntityManager entityManager, final Class<T> entityClass, final QueryType queryType) {
basicCriteriaElements = BasicCriteriaElementsFactory.create(entityManager, entityClass, queryType);
criteriaCreator = new CriteriaCreator(basicCriteriaElements);
}
protected UaiCriteriaImp(final String selectedAttribute, final Class<T> subQueryClass, final BasicCriteriaElements basicCriteriaElements) {
this.basicCriteriaElements = BasicCriteriaElementsFactory.createSubQuery(selectedAttribute, subQueryClass, basicCriteriaElements);
criteriaCreator = new CriteriaCreator(this.basicCriteriaElements);
}
@Override
public List<T> getResultList() {
final TypedQuery<T> query = basicCriteriaElements.getRegularQuery();
return query.getResultList();
}
@Override
public T getSingleResult() {
final TypedQuery<T> query = basicCriteriaElements.getRegularQuery();
return query.getSingleResult();
}
@Override
public List getMultiSelectResult() {
final TypedQuery<Object> query = basicCriteriaElements.getMultiSelectQuery();
return query.getResultList();
}
@Override
public <E> UaiCriteria<E> subQuery(final String subQueryResult, final Class<E> entityClass) {
return new SubQueryImp<E>(subQueryResult, entityClass, basicCriteriaElements);
}
@Override
public Long count() {
return countRegularCriteria();
}
@Override
public Long countRegularCriteria() {
final TypedQuery<Long> query = basicCriteriaElements.getCountQuery();
return query.getSingleResult();
}
@Override
public UaiCriteria<T> countAttribute(final String... attributeNameArray) {
criteriaCreator.countAttribute(attributeNameArray);
return this;
}
@Override
public UaiCriteria<T> andEquals(final String attributeName, final Object value) {
criteriaCreator.andEquals(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andEquals(final boolean toLowerCase, final String attributeName, final String value) {
criteriaCreator.andEquals(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> orEquals(final String attributeName, final Object... valueArray) {
criteriaCreator.orEquals(DO_NOT_APPLY_LOWER_CASE, attributeName, valueArray);
return this;
}
@Override
public UaiCriteria<T> orEquals(final boolean toLowerCase, final String attributeName, final String... valueArray) {
criteriaCreator.orEquals(toLowerCase, attributeName, valueArray);
return this;
}
@Override
public UaiCriteria<T> orEquals(final int index, final String attributeName, final Object... valueArray) {
criteriaCreator.orEquals(DO_NOT_APPLY_LOWER_CASE, index, attributeName, valueArray, CriteriaOrType.EQUALS);
return this;
}
@Override
public UaiCriteria<T> orEquals(final boolean toLowerCase, final int index, final String attributeName, final String... valueArray) {
criteriaCreator.orEquals(toLowerCase, index, attributeName, valueArray, CriteriaOrType.EQUALS);
return this;
}
@Override
public UaiCriteria<T> orStringLike(final String attributeName, final String... stringArray) {
return orStringLike(DO_NOT_APPLY_LOWER_CASE, attributeName, stringArray);
}
@Override
public UaiCriteria<T> orStringLike(final boolean toLowerCase, final String attributeName, final String... stringArray) {
criteriaCreator.orLike(toLowerCase, attributeName, stringArray);
return this;
}
@Override
public UaiCriteria<T> orStringNotLike(final String attributeName, final String... stringArray) {
return orStringNotLike(DO_NOT_APPLY_LOWER_CASE, attributeName, stringArray);
}
@Override
public UaiCriteria<T> orStringNotLike(final boolean toLowerCase, final String attributeName, final String... stringArray) {
criteriaCreator.orNotLike(toLowerCase, attributeName, stringArray);
return this;
}
@Override
public UaiCriteria<T> andIsMemberOf(final Object value, final String collectionName) {
criteriaCreator.andIsMemberOf(value, collectionName);
return this;
}
@Override
public UaiCriteria<T> andIsNotMemberOf(final Object value, final String collectionName) {
criteriaCreator.andIsNotMemberOf(value, collectionName);
return this;
}
@Override
public UaiCriteria<T> andNotEquals(final String attributeName, final Object value) {
criteriaCreator.andNotEquals(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andNotEquals(final boolean toLowerCase, final String attributeName, final String value) {
criteriaCreator.andNotEquals(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> orNotEquals(final String attributeName, final Object... valueArray) {
criteriaCreator.orNotEquals(DO_NOT_APPLY_LOWER_CASE, attributeName, valueArray);
return this;
}
@Override
public UaiCriteria<T> orNotEquals(final boolean toLowerCase, final String attributeName, final String... valueArray) {
criteriaCreator.orNotEquals(toLowerCase, attributeName, valueArray);
return this;
}
@Override
public UaiCriteria<T> andGreaterThan(final String attributeName, final Object value) {
criteriaCreator.andGreaterThan(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andGreaterThan(final boolean toLowerCase, final String attributeName, final String value) {
criteriaCreator.andGreaterThan(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andGreaterOrEqualTo(final String attributeName, final Object value) {
criteriaCreator.andGreaterOrEqualTo(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andGreaterOrEqualTo(final boolean toLowerCase, final String attributeName, final String value) {
criteriaCreator.andGreaterOrEqualTo(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andLessThan(final String attributeName, final Object value) {
criteriaCreator.andLessThan(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andLessThan(final boolean toLowerCase, final String attributeName, final String value) {
criteriaCreator.andLessThan(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andLessOrEqualTo(final String attributeName, final Object value) {
criteriaCreator.andLessOrEqualTo(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andLessOrEqualTo(final boolean toLowerCase, final String attributeName, final String value) {
criteriaCreator.andLessOrEqualTo(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> innerJoin(final String joinName) {
criteriaCreator.innerJoin(joinName);
return this;
}
@Override
public UaiCriteria<T> leftJoin(final String joinName) {
criteriaCreator.leftJoin(joinName);
return this;
}
@Override
public UaiCriteria<T> innerJoinFetch(final String joinName) {
criteriaCreator.innerJoinFetch(joinName);
return this;
}
@Override
public UaiCriteria<T> leftJoinFetch(final String joinName) {
criteriaCreator.leftJoinFetch(joinName);
return this;
}
@Override
public UaiCriteria<T> setDistinctTrue() {
criteriaCreator.setDistinctTrue();
return this;
}
@Override
public UaiCriteria<T> andBetween(final String attributeName, final Object valueA, final Object valueB) {
criteriaCreator.andBetween(DO_NOT_APPLY_LOWER_CASE, attributeName, valueA, valueB);
return this;
}
@Override
public UaiCriteria<T> andBetween(final boolean toLowerCase, final String attributeName, final String valueA, final String valueB) {
criteriaCreator.andBetween(toLowerCase, attributeName, valueA, valueB);
return this;
}
@Override
public UaiCriteria<T> andIsNull(final String attributeName) {
criteriaCreator.andIsNull(attributeName);
return this;
}
@Override
public UaiCriteria<T> orIsNull(final String attributeName) {
criteriaCreator.orIsNull(attributeName);
return this;
}
@Override
public UaiCriteria<T> andIsNotNull(final String attributeName) {
criteriaCreator.andIsNotNull(attributeName);
return this;
}
@Override
public UaiCriteria<T> orIsNotNull(final String attributeName) {
criteriaCreator.orIsNotNull(attributeName);
return this;
}
@Override
public UaiCriteria<T> andCollectionIsEmpty(final String collectionName) {
if (basicCriteriaElements.isBatooProvider()) {
LOG.warning(IS_EMPTY_BATOO_MESSAGE);
}
criteriaCreator.andCollectionIsEmpty(collectionName);
return this;
}
@Override
public UaiCriteria<T> andCollectionIsNotEmpty(final String collectionName) {
if (basicCriteriaElements.isBatooProvider()) {
LOG.warning(IS_EMPTY_BATOO_MESSAGE);
}
criteriaCreator.andCollectionIsNotEmpty(collectionName);
return this;
}
@Override
public UaiCriteria<T> andStringLike(final String attributeName, final String value) {
return andStringLike(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
}
@Override
public UaiCriteria<T> andStringLike(final boolean toLowerCase, final String attributeName, final String value) {
if (basicCriteriaElements.isBatooProvider()) {
LOG.warning("There is a problem with Batoo and this kind of criteria. it does not bring the results, but works with the other providers");
}
criteriaCreator.andStringLike(toLowerCase, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> andStringNotLike(final String attributeName, final String value) {
return andStringNotLike(DO_NOT_APPLY_LOWER_CASE, attributeName, value);
}
@Override
public UaiCriteria<T> andStringNotLike(final boolean toLowerCase, final String attributeName, final String value) {
if (basicCriteriaElements.isBatooProvider()) {
LOG.warning("There is a problem with Batoo and this kind of criteria. Check here for more details: http://stackoverflow.com/questions/24942520/how-to-use-criteria-isempty-with-batto");
}
criteriaCreator.andStringNotLike(toLowerCase, attributeName, value);
return this;
}
@Override
public <E> UaiCriteria<T> andAttributeIn(final String attributeName, final List<E> attributeList) {
criteriaCreator.andAttributeIn(attributeName, attributeList);
return this;
}
@Override
public <E> UaiCriteria<T> andAttributeIn(final String attributeName, final UaiCriteria<E> uaiSubQuery) {
if (!(uaiSubQuery instanceof SubQueryImp)) {
throw new IllegalArgumentException("This is not an acceptable implementation of uaiSubQuery type. \n Are you sure that you passed the correct attribute here?");
}
criteriaCreator.andAttributeIn(attributeName, (SubQueryImp) uaiSubQuery);
return this;
}
@Override
public <E> UaiCriteria<T> andAttributeNotIn(final String attributeName, final List<E> attributeList) {
criteriaCreator.andAttributeNotIn(attributeName, attributeList);
return this;
}
@Override
public <E> UaiCriteria<T> andAttributeNotIn(final String attributeName, final UaiCriteria<E> uaiSubQuery) {
if (!(uaiSubQuery instanceof SubQueryImp)) {
throw new IllegalArgumentException("This is not an acceptable implementation of uaiSubQuery type. \n Are you sure that you passed the correct attribute here?");
}
criteriaCreator.andAttributeNotIn(attributeName, (SubQueryImp) uaiSubQuery);
return this;
}
@Override
public UaiCriteria<T> andStringIn(final String attributeName, final List<String> values) {
return andStringIn(DO_NOT_APPLY_LOWER_CASE, attributeName, values);
}
@Override
public UaiCriteria<T> andStringIn(final boolean toLowerCase, final String attributeName, final List<String> values) {
criteriaCreator.andStringIn(toLowerCase, attributeName, values);
return this;
}
@Override
public UaiCriteria<T> andStringNotIn(final String attributeName, final List<String> values) {
return andStringNotIn(DO_NOT_APPLY_LOWER_CASE, attributeName, values);
}
@Override
public UaiCriteria<T> andStringNotIn(final boolean toLowerCase, final String attributeName, final List<String> values) {
criteriaCreator.andStringNotIn(toLowerCase, attributeName, values);
return this;
}
@Override
public UaiCriteria<T> orderByAsc(final String attributeName) {
criteriaCreator.orderByAsc(attributeName);
return this;
}
@Override
public UaiCriteria<T> orderByDesc(final String attributeName) {
criteriaCreator.orderByDesc(attributeName);
return this;
}
@Override
public UaiCriteria<T> setFirstResult(final Integer firstResult) {
criteriaCreator.setFirstResult(firstResult);
return this;
}
@Override
public UaiCriteria<T> setMaxResults(final Integer maxResults) {
criteriaCreator.setMaxResults(maxResults);
return this;
}
@Override
public UaiCriteria<T> addAndSeparatedByOr(final int index, final String attributeName, final Object value) {
criteriaCreator.addAndSeparatedByOr(DO_NOT_APPLY_LOWER_CASE, index, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> addAndSeparatedByOr(final boolean toLowerCase, final int index, final String attributeName, final String value) {
criteriaCreator.addAndSeparatedByOr(toLowerCase, index, attributeName, value);
return this;
}
@Override
public UaiCriteria<T> addHint(final String key, final String value) {
criteriaCreator.addHint(key, value);
return this;
}
@Override
public UaiCriteria<T> sum(final String... attributeNameArray) {
criteriaCreator.sum(attributeNameArray);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> sum(final String attributeName, final N number) {
criteriaCreator.sum(attributeName, number);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> sum(final N number, final String attributeName) {
criteriaCreator.sum(number, attributeName);
return this;
}
@Override
public UaiCriteria<T> diff(final String firstAttribute, final String secondAttribute) {
criteriaCreator.diff(firstAttribute, secondAttribute);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> diff(final String attributeName, final N number) {
criteriaCreator.diff(attributeName, number);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> diff(final N number, final String attributeName) {
criteriaCreator.diff(number, attributeName);
return this;
}
@Override
public UaiCriteria<T> multiply(final String firstAttribute, final String secondAttribute) {
criteriaCreator.multiply(firstAttribute, secondAttribute);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> multiply(final String attributeName, final N number) {
criteriaCreator.multiply(attributeName, number);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> multiply(final N number, final String attributeName) {
criteriaCreator.multiply(number, attributeName);
return this;
}
@Override
public UaiCriteria<T> divide(final String firstAttribute, final String secondAttribute) {
criteriaCreator.divide(firstAttribute, secondAttribute);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> divide(final String attributeName, final N number) {
criteriaCreator.divide(attributeName, number);
return this;
}
@Override
public <N extends Number> UaiCriteria<T> divide(final N number, final String attributeName) {
criteriaCreator.divide(number, attributeName);
return this;
}
@Override
public UaiCriteria<T> module(final String firstAttribute, final String secondAttribute) {
criteriaCreator.module(firstAttribute, secondAttribute);
return this;
}
@Override
public UaiCriteria<T> module(final String attributeName, final Integer number) {
criteriaCreator.module(attributeName, number);
return this;
}
@Override
public UaiCriteria<T> module(final Integer number, final String attributeName) {
criteriaCreator.module(number, attributeName);
return this;
}
@Override
public UaiCriteria<T> average(final String... attributeNameArray) {
criteriaCreator.avg(attributeNameArray);
return this;
}
@Override
public UaiCriteria<T> square(final String... attributeNameArray) {
criteriaCreator.square(attributeNameArray);
return this;
}
@Override
public UaiCriteria<T> addMultiSelectAttribute(final String... attributeNameArray) {
criteriaCreator.addMultiSelectSelectAttribute(attributeNameArray);
return this;
}
@Override
public UaiCriteria<T> groupBy(final String... attributeNameArray) {
criteriaCreator.groupBy(attributeNameArray);
return this;
}
}