package wicket.contrib.woogle.dao.hibernate; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Restrictions; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import wicket.contrib.woogle.dao.SearchDAO; import wicket.contrib.woogle.domain.Search; public class SearchDAOHibernate extends HibernateDaoSupport implements SearchDAO { public void save(Search search) { // Only persist if no other searches found with the same // search string and session id. DetachedCriteria c = DetachedCriteria.forClass(Search.class); c.add(Restrictions.eq("search", search.getSearch())); c.add(Restrictions.eq("sessionId", search.getSessionId())); List result = getHibernateTemplate().findByCriteria(c); if (result.size() == 0) { getHibernateTemplate().save(search); } } @SuppressWarnings("unchecked") public List<Search> listTopSearches() { // Get total number of searches String hql = "SELECT COUNT(s) FROM Search s"; int countResult = (Integer) getHibernateTemplate().find(hql).get(0); hql = "SELECT s, COUNT(s.search) FROM Search s GROUP BY s.search ORDER BY COUNT(s.search) DESC"; getHibernateTemplate().setMaxResults(10); List result = getHibernateTemplate().find(hql); List<Search> searches = new ArrayList<Search>(); for (Iterator iter = result.iterator(); iter.hasNext();) { Object[] element = (Object[]) iter.next(); Search search = (Search) element[0]; int searchCount = (Integer) element[1]; double pct = (double)searchCount/(double)countResult; search.setPct((int) Math.round(pct*100)); searches.add(search); } return searches; } }