package org.jboss.seam.wiki.core.dao; import org.hibernate.Session; import org.hibernate.Query; import org.hibernate.transform.Transformers; import org.jboss.seam.annotations.AutoCreate; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.log.Log; import org.jboss.seam.wiki.core.model.*; import javax.persistence.EntityManager; import java.util.Collections; import java.util.List; @Name("tagDAO") @AutoCreate public class TagDAO { @Logger static Log log; @In protected EntityManager restrictedEntityManager; @In protected WikiNodeDAO wikiNodeDAO; public List<DisplayTagCount> findTagCounts(WikiDirectory startDir, WikiFile ignoreFile, int limit, long minimumCount) { StringBuilder queryString = new StringBuilder(); queryString.append("select t as tag, count(t) as count").append(" "); queryString.append("from WikiFile f join f.tags as t").append(" "); queryString.append("where f.parent.id in (:parentDirIds) "); if (ignoreFile != null && ignoreFile.getId() != null) queryString.append("and not f = :ignoreFile").append(" "); queryString.append("group by t").append(" "); queryString.append("having count(t) >= :minimumCount").append(" "); queryString.append("order by count(t) desc, t asc "); Query tagQuery = getSession().createQuery(queryString.toString()); tagQuery.setParameterList("parentDirIds", wikiNodeDAO.findWikiDirectoryTreeIDs(startDir)); tagQuery.setParameter("minimumCount", minimumCount); if (ignoreFile != null && ignoreFile.getId() != null) tagQuery.setParameter("ignoreFile", ignoreFile); if (limit > 0) { tagQuery.setMaxResults(limit); } tagQuery.setResultTransformer(Transformers.aliasToBean(DisplayTagCount.class)); return tagQuery.list(); } public List<WikiFile> findWikFiles(WikiDirectory startDir, WikiFile ignoreFile, final String tag, WikiNode.SortableProperty orderBy, boolean orderAscending) { if (tag == null || tag.length() == 0) return Collections.EMPTY_LIST; StringBuilder queryString = new StringBuilder(); queryString.append("select distinct f from WikiFile f join f.tags as t "); queryString.append("where f.parent.id in (:parentDirIds) "); if (ignoreFile != null && ignoreFile.getId() != null) queryString.append("and not f = :ignoreFile").append(" "); queryString.append("and t = :tag").append(" "); queryString.append("order by f.").append(orderBy.name()).append(" ").append(orderAscending ? "asc" : "desc"); Query fileQuery = getSession().createQuery(queryString.toString()); fileQuery.setParameterList("parentDirIds", wikiNodeDAO.findWikiDirectoryTreeIDs(startDir)); if (ignoreFile != null && ignoreFile.getId() != null) fileQuery.setParameter("ignoreFile", ignoreFile); fileQuery.setParameter("tag", tag); return fileQuery.list(); } private Session getSession() { return ((Session)((org.jboss.seam.persistence.EntityManagerProxy) restrictedEntityManager).getDelegate()); } }