/*
* 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.cto;
import com.uaihebert.uaicriteria.UaiCriteria;
import com.uaihebert.uaicriteria.UaiCriteriaImp;
import com.uaihebert.uaicriteria.criteria.QueryType;
import javax.persistence.EntityManager;
import java.util.Arrays;
public final class UaiCriteriaBuilder {
private UaiCriteriaBuilder() {
}
public static <T> UaiCriteria<T> createUaiCriteriaFromCTO(final UaiCriteria<T> uaiCTO, final EntityManager entityManager, final Class<T> entityClass, final QueryType queryType) {
final UaiCriteriaImp<T> uaiCriteria = new UaiCriteriaImp<T>(entityManager, entityClass, queryType);
final UaiCTOImp<T> uaiCTOImp = (UaiCTOImp) uaiCTO;
setPagination(uaiCTOImp, uaiCriteria);
configureJoins(uaiCTOImp, uaiCriteria);
addMultiSelectAttributes(uaiCTOImp, uaiCriteria);
addCriteriaConditions(uaiCTOImp, uaiCriteria);
configureGroupBy(uaiCTOImp, uaiCriteria);
orderCriteria(uaiCTOImp, uaiCriteria);
if (uaiCTOImp.distinct) {
uaiCriteria.setDistinctTrue();
}
return uaiCriteria;
}
private static <T> void addMultiSelectAttributes(final UaiCTOImp<T> uaiCTOImp, final UaiCriteriaImp<T> uaiCriteria) {
uaiCriteria.addMultiSelectAttribute(Arrays.copyOf(uaiCTOImp.multiselectAttributeList.toArray(), uaiCTOImp.multiselectAttributeList.toArray().length, String[].class));
}
private static <T> void configureGroupBy(final UaiCTOImp<T> uaiCTOImp, final UaiCriteriaImp<T> uaiCriteria) {
uaiCriteria.groupBy(Arrays.copyOf(uaiCTOImp.groupByList.toArray(), uaiCTOImp.groupByList.toArray().length, String[].class));
}
private static <T> void setPagination(final UaiCTOImp<T> uaiCTOImp, final UaiCriteriaImp<T> uaiCriteria) {
if (uaiCTOImp.getFirstResult() != null) {
uaiCriteria.setFirstResult(uaiCTOImp.getFirstResult());
uaiCTOImp.setFirstResult(null);
}
if (uaiCTOImp.getMaxResults() != null) {
uaiCriteria.setMaxResults(uaiCTOImp.getMaxResults());
uaiCTOImp.setMaxResults(null);
}
}
private static <T> void orderCriteria(final UaiCTOImp<T> uaiCTOImp, final UaiCriteriaImp<T> uaiCriteria) {
for (final OrderByHolder holder : uaiCTOImp.orderByList) {
if (holder.isDesc) {
uaiCriteria.orderByDesc(holder.attributeName);
continue;
}
uaiCriteria.orderByAsc(holder.attributeName);
}
}
private static <T> void configureJoins(final UaiCTOImp<T> uaiCTOImp, final UaiCriteriaImp<T> uaiCriteria) {
for (final JoinHolder holder : uaiCTOImp.joinList) {
holder.joinHolderType.createJoin(uaiCriteria, holder);
}
}
private static <T> void addCriteriaConditions(final UaiCTOImp<T> uaiCTOImp, final UaiCriteriaImp<T> uaiCriteria) {
for (final CriteriaConditionHolder holder : uaiCTOImp.criteriaConditionTypeList) {
holder.criteriaConditionType.createCondition(holder, uaiCriteria);
}
}
}