/*
* 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.base.element;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.Subquery;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class BasicCriteriaElements<T> {
private Integer maxResults;
private Integer firstResult;
EntityManager entityManager;
private BaseCriteria countCriteria;
private BaseCriteria multiselectCriteria;
private BaseCriteria regularCriteria;
private BaseCriteria subQueryCriteria;
private final List<BaseCriteria> baseCriteriaList = new ArrayList<BaseCriteria>();
public TypedQuery<T> getRegularQuery() {
if (regularCriteria == null) {
throw new IllegalStateException("You cannot get a regular query when you create a multiselect query");
}
regularCriteria.setUpCriteria();
final TypedQuery typedQuery = entityManager.createQuery(regularCriteria.getConvertedCriteriaQuery());
setPagination(typedQuery);
setUpHintMap(typedQuery, regularCriteria);
return typedQuery;
}
public BaseCriteria<T> getBaseCriteriaForSubQuery() {
return regularCriteria;
}
public TypedQuery<Long> getCountQuery() {
if (multiselectCriteria != null) {
throw new IllegalStateException("You cannot get a count from multiselect query. \n If you want to count, you should use the method that will count an attribute");
}
countCriteria.setCountSelect();
countCriteria.setUpCriteria();
final TypedQuery<Long> typedQuery = entityManager.createQuery(countCriteria.getConvertedCriteriaQuery());
setPagination(typedQuery);
setUpHintMap(typedQuery, countCriteria);
return typedQuery;
}
public TypedQuery<Object> getMultiSelectQuery() {
if (multiselectCriteria == null) {
throw new IllegalStateException("You cannot get a multiselect query when you create a regular query");
}
multiselectCriteria.setMultiSelectSelect();
multiselectCriteria.setUpCriteria();
final TypedQuery<Object> typedQuery = entityManager.createQuery(multiselectCriteria.getConvertedCriteriaQuery());
setPagination(typedQuery);
setUpHintMap(typedQuery, multiselectCriteria);
return typedQuery;
}
private void setUpHintMap(final TypedQuery typedQuery, final BaseCriteria baseCriteria) {
final Map<String, String> createdHintMap = baseCriteria.getCreatedHintMap();
for (final Map.Entry<String, String> entry : createdHintMap.entrySet()) {
typedQuery.setHint(entry.getKey(), entry.getValue());
}
}
private void setPagination(final TypedQuery typedQuery) {
if (firstResult != null) {
typedQuery.setFirstResult(firstResult);
}
if (maxResults != null) {
typedQuery.setMaxResults(maxResults);
}
}
public List<BaseCriteria> getBaseCriteriaList() {
return baseCriteriaList;
}
public void setFirstResult(final Integer firstResult) {
this.firstResult = firstResult;
}
public void setMaxResults(final Integer maxResults) {
this.maxResults = maxResults;
}
public boolean isBatooProvider() {
return entityManager.toString().contains("batoo");
}
public Subquery getSubquery() {
return subQueryCriteria.getSubquery();
}
public BaseCriteria getBaseSubCriteria() {
return subQueryCriteria;
}
public void setCountCriteria(final BaseCriteria countCriteria) {
this.countCriteria = countCriteria;
baseCriteriaList.add(this.countCriteria);
}
public void setMultiSelectCriteria(final BaseCriteria multiselectCriteria) {
this.multiselectCriteria = multiselectCriteria;
baseCriteriaList.add(this.multiselectCriteria);
}
public void setRegularCriteria(final BaseCriteria regularCriteria) {
this.regularCriteria = regularCriteria;
baseCriteriaList.add(this.regularCriteria);
}
public void setSubQueryCriteria(final BaseCriteria subQueryCriteria) {
this.subQueryCriteria = subQueryCriteria;
baseCriteriaList.add(this.subQueryCriteria);
}
}