package com.jspxcms.core.repository.impl;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.commons.lang3.ArrayUtils;
import org.hibernate.ejb.QueryHints;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import com.jspxcms.common.orm.Limitable;
import com.jspxcms.common.orm.QuerydslUtils;
import com.jspxcms.core.domain.Info;
import com.jspxcms.core.domaindsl.QAttribute;
import com.jspxcms.core.domaindsl.QInfo;
import com.jspxcms.core.domaindsl.QInfoAttribute;
import com.jspxcms.core.domaindsl.QInfoDetail;
import com.jspxcms.core.domaindsl.QInfoNode;
import com.jspxcms.core.domaindsl.QInfoSpecial;
import com.jspxcms.core.domaindsl.QInfoTag;
import com.jspxcms.core.domaindsl.QSpecial;
import com.jspxcms.core.domaindsl.QTag;
import com.jspxcms.core.repository.InfoDaoPlus;
import com.mysema.query.BooleanBuilder;
import com.mysema.query.jpa.impl.JPAQuery;
import com.mysema.query.types.expr.BooleanExpression;
import com.mysema.query.types.path.StringPath;
/**
* InfoDaoImpl
*
* @author liufang
*
*/
public class InfoDaoImpl implements InfoDaoPlus {
public List<Info> findList(Integer[] nodeId, Integer[] attrId,
Integer[] specialId, Integer[] tagId, Integer[] siteId,
Integer[] mainNodeId, Integer[] userId, String[] treeNumber,
String[] specialTitle, String[] tagName, Integer[] priority,
Date startDate, Date endDate, String[] title, Integer[] includeId,
Integer[] excludeId, Integer[] excludeMainNodeId,
String[] excludeTreeNumber, Boolean isWithImage, String[] status,
Limitable limitable) {
JPAQuery query = new JPAQuery(this.em);
query.setHint(QueryHints.HINT_CACHEABLE, true);
QInfo info = QInfo.info;
predicate(query, info, nodeId, attrId, specialId, tagId, siteId,
mainNodeId, userId, treeNumber, specialTitle, tagName,
priority, startDate, endDate, title, includeId, excludeId,
excludeMainNodeId, excludeTreeNumber, isWithImage, status);
return QuerydslUtils.list(query, info, limitable);
}
public Page<Info> findPage(Integer[] nodeId, Integer[] attrId,
Integer[] specialId, Integer[] tagId, Integer[] siteId,
Integer[] mainNodeId, Integer[] userId, String[] treeNumber,
String[] specialTitle, String[] tagName, Integer[] priority,
Date startDate, Date endDate, String[] title, Integer[] includeId,
Integer[] excludeId, Integer[] excludeMainNodeId,
String[] excludeTreeNumber, Boolean isWithImage, String[] status,
Pageable pageable) {
JPAQuery query = new JPAQuery(this.em);
query.setHint(QueryHints.HINT_CACHEABLE, true);
QInfo info = QInfo.info;
predicate(query, info, nodeId, attrId, specialId, tagId, siteId,
mainNodeId, userId, treeNumber, specialTitle, tagName,
priority, startDate, endDate, title, includeId, excludeId,
excludeMainNodeId, excludeTreeNumber, isWithImage, status);
return QuerydslUtils.page(query, info, pageable);
}
private void predicate(JPAQuery query, QInfo info, Integer[] nodeId,
Integer[] attrId, Integer[] specialId, Integer[] tagId,
Integer[] siteId, Integer[] mainNodeId, Integer[] userId,
String[] treeNumber, String[] specialTitle, String[] tagName,
Integer[] priority, Date startDate, Date endDate, String[] title,
Integer[] includeId, Integer[] excludeId,
Integer[] excludeMainNodeId, String[] excludeTreeNumber,
Boolean isWithImage, String[] status) {
boolean isDistinct = false;
query.from(info);
BooleanBuilder exp = new BooleanBuilder();
if (ArrayUtils.isNotEmpty(nodeId)) {
QInfoNode infoNode = QInfoNode.infoNode;
query.innerJoin(info.infoNodes, infoNode);
exp = exp.and(infoNode.node.id.in(nodeId));
if (nodeId.length > 1) {
isDistinct = true;
}
}
if (ArrayUtils.isNotEmpty(attrId)) {
QInfoAttribute infoAttr = QInfoAttribute.infoAttribute;
QAttribute attr = QAttribute.attribute;
query.innerJoin(info.infoAttrs, infoAttr).innerJoin(
infoAttr.attribute, attr);
exp = exp.and(attr.id.in(attrId));
if (attrId.length > 1) {
isDistinct = true;
}
}
boolean isSpecialId = ArrayUtils.isNotEmpty(specialId);
boolean isSpecialTitle = ArrayUtils.isNotEmpty(specialTitle);
if (isSpecialId || isSpecialTitle) {
QInfoSpecial infoSpeical = QInfoSpecial.infoSpecial;
query.innerJoin(info.infoSpecials, infoSpeical);
QSpecial special = QSpecial.special;
query.innerJoin(infoSpeical.special, special);
BooleanBuilder e = new BooleanBuilder();
if (isSpecialId) {
for (int i = 0, len = specialId.length; i < len; i++) {
e = e.or(special.id.eq(specialId[i]));
}
if (specialId.length > 1) {
isDistinct = true;
}
}
if (isSpecialTitle) {
for (int i = 0, len = specialTitle.length; i < len; i++) {
e = e.or(special.title.like(specialTitle[i]));
}
isDistinct = true;
}
exp = exp.and(e);
}
boolean isTagId = ArrayUtils.isNotEmpty(tagId);
boolean isTagName = ArrayUtils.isNotEmpty(tagName);
if (isTagId || isTagName) {
QInfoTag infoTag = QInfoTag.infoTag;
query.innerJoin(info.infoTags, infoTag);
QTag tag = QTag.tag;
query.innerJoin(infoTag.tag, tag);
BooleanBuilder e = new BooleanBuilder();
if (isTagId) {
for (int i = 0, len = tagId.length; i < len; i++) {
e = e.or(tag.id.eq(tagId[i]));
}
if (tagId.length > 1) {
isDistinct = true;
}
}
if (isTagName) {
for (int i = 0, len = tagName.length; i < len; i++) {
e = e.or(tag.name.like(tagName[i]));
}
isDistinct = true;
}
exp = exp.and(e);
}
if (ArrayUtils.isNotEmpty(siteId)) {
exp = exp.and(info.site.id.in(siteId));
}
if (ArrayUtils.isNotEmpty(mainNodeId)) {
BooleanExpression e = info.node.id.eq(mainNodeId[0]);
for (int i = 1, len = mainNodeId.length; i < len; i++) {
e = e.or(info.node.id.eq(mainNodeId[i]));
}
exp = exp.and(e);
}
if (ArrayUtils.isNotEmpty(excludeMainNodeId)) {
exp = exp.and(info.node.id.notIn(excludeMainNodeId));
}
if (ArrayUtils.isNotEmpty(userId)) {
BooleanExpression e = info.creator.id.eq(userId[0]);
for (int i = 1, len = userId.length; i < len; i++) {
e = e.or(info.creator.id.eq(userId[i]));
}
exp = exp.and(e);
}
boolean isTreeNumber = ArrayUtils.isNotEmpty(treeNumber);
boolean isExcludeTreeNumber = ArrayUtils.isNotEmpty(excludeTreeNumber);
if (isTreeNumber || isExcludeTreeNumber) {
StringPath tnPath = info.node.treeNumber;
if (isTreeNumber) {
BooleanExpression e = tnPath.startsWith(treeNumber[0]);
for (int i = 1, len = treeNumber.length; i < len; i++) {
e = e.or(tnPath.startsWith(treeNumber[i]));
}
exp = exp.and(e);
}
if (isExcludeTreeNumber) {
for (int i = 0, len = excludeTreeNumber.length; i < len; i++) {
exp = exp
.and(tnPath.startsWith(excludeTreeNumber[i]).not());
}
}
}
if (ArrayUtils.isNotEmpty(priority)) {
BooleanExpression e = info.priority.eq(priority[0]);
for (int i = 1, len = priority.length; i < len; i++) {
e = e.or(info.priority.eq(priority[i]));
}
exp = exp.and(e);
}
if (startDate != null) {
exp = exp.and(info.publishDate.goe(startDate));
}
if (endDate != null) {
exp = exp.and(info.publishDate.loe(endDate));
}
if (ArrayUtils.isNotEmpty(title)) {
QInfoDetail infoDetail = QInfoDetail.infoDetail;
query.innerJoin(info.detail, infoDetail);
BooleanExpression e = infoDetail.title.like(title[0]);
for (int i = 1, len = title.length; i < len; i++) {
e = e.or(infoDetail.title.like(title[i]));
}
exp = exp.and(e);
}
if (ArrayUtils.isNotEmpty(includeId)) {
exp = exp.and(info.id.in(includeId));
}
if (ArrayUtils.isNotEmpty(excludeId)) {
exp = exp.and(info.id.notIn(excludeId));
}
if (ArrayUtils.isNotEmpty(excludeTreeNumber)) {
}
if (isWithImage != null) {
exp = exp.and(info.withImage.eq(isWithImage));
}
if (ArrayUtils.isNotEmpty(status)) {
exp = exp.and(info.status.in(status));
}
query.where(exp);
if (isDistinct) {
query.distinct();
}
}
public Info findNext(Integer siteId, Integer nodeId, Integer id,
Date publishDate) {
JPAQuery query = new JPAQuery(this.em);
QInfo info = QInfo.info;
query.from(info);
BooleanBuilder exp = new BooleanBuilder();
if (nodeId != null) {
exp = exp.and(info.node.id.eq(nodeId));
} else if (siteId != null) {
exp = exp.and(info.site.id.eq(siteId));
}
exp = exp.and(info.publishDate.goe(publishDate));
exp = exp.and(info.id.lt(id).or(info.id.gt(id)));
query.where(exp);
query.orderBy(info.publishDate.asc(), info.id.asc());
query.limit(1);
List<Info> list = query.list(info);
return list.isEmpty() ? null : list.get(0);
}
public Info findPrev(Integer siteId, Integer nodeId, Integer id,
Date publishDate) {
JPAQuery query = new JPAQuery(this.em);
QInfo info = QInfo.info;
query.from(info);
BooleanBuilder expr = new BooleanBuilder();
if (nodeId != null) {
expr = expr.and(info.node.id.eq(nodeId));
} else if (siteId != null) {
expr = expr.and(info.site.id.eq(siteId));
}
expr = expr.and(info.publishDate.loe(publishDate));
expr = expr.and(info.id.lt(id).or(info.id.gt(id)));
query.where(expr);
query.orderBy(info.publishDate.desc(), info.id.desc());
query.limit(1);
List<Info> list = query.list(info);
return list.isEmpty() ? null : list.get(0);
}
private EntityManager em;
@javax.persistence.PersistenceContext
public void setEm(EntityManager em) {
this.em = em;
}
}