org.encuestame.persistence.dao.imp.PollDao.java Source code

Java tutorial

Introduction

Here is the source code for org.encuestame.persistence.dao.imp.PollDao.java

Source

/*
 ************************************************************************************
 * Copyright (C) 2001-2011 encuestame: system online surveys Copyright (C) 2011
 * encuestame Development Team.
 * Licensed under the Apache Software License version 2.0
 * 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 org.encuestame.persistence.dao.imp;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.collections.set.ListOrderedSet;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.encuestame.persistence.dao.IPoll;
import org.encuestame.persistence.dao.search.QueryBuilder;
import org.encuestame.persistence.domain.HashTag;
import org.encuestame.persistence.domain.question.Question;
import org.encuestame.persistence.domain.security.Account;
import org.encuestame.persistence.domain.security.UserAccount;
import org.encuestame.persistence.domain.survey.Poll;
import org.encuestame.persistence.domain.survey.PollFolder;
import org.encuestame.persistence.domain.survey.PollResult;
import org.encuestame.utils.DateUtil;
import org.encuestame.utils.RestFullUtil;
import org.encuestame.utils.enums.SearchPeriods;
import org.encuestame.utils.enums.TypeSearchResult;
import org.encuestame.utils.web.search.PollSearchBean;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Subqueries;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.stereotype.Repository;

/**
 * Poll Dao.
 * @author Morales,Diana Paola paolaATencuestame.org
 * @since March 15, 2009
 */
@Repository("pollDao")
public class PollDao extends AbstractHibernateDaoSupport implements IPoll {

    /**
     * Constructor.
     * @param sessionFactory
     */
    @Autowired
    public PollDao(SessionFactory sessionFactory) {
        setSessionFactory(sessionFactory);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollFolderBySecUser(org.encuestame.persistence.domain.security.UserAccount)
     */
    @SuppressWarnings("unchecked")
    public List<PollFolder> getPollFolderByUserAccount(final UserAccount userAccount) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(PollFolder.class);
        criteria.add(Restrictions.eq("createdBy", userAccount));
        return (List<PollFolder>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollsByPollFolder(org.encuestame.persistence.domain.security.UserAccount, org.encuestame.persistence.domain.survey.PollFolder)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPollsByPollFolder(final UserAccount userAcc, final PollFolder folder) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("owner.uid", userAcc.getAccount().getUid()));
        criteria.add(Restrictions.eq("pollFolder", folder));
        return (List<Poll>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollsByPollFolderId(org.encuestame.persistence.domain.security.UserAccount, org.encuestame.persistence.domain.survey.PollFolder)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPollsByPollFolderId(final UserAccount userId, final PollFolder folder) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        //criteria.createAlias("tweetOwner", "tweetOwner");
        criteria.add(Restrictions.eq("owner.uid", userId.getAccount().getUid()));
        criteria.add(Restrictions.eq("pollFolder", folder));
        return (List<Poll>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#findAllPollByUserId(org.encuestame.persistence.domain.security.UserAccount, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> findAllPollByEditorOwner(final UserAccount userAcc, final Integer maxResults,
            final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("editorOwner", userAcc));
        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        criteria.addOrder(Order.desc("createDate"));
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /**
     * Retrieve poll by {@link Account}.
     * @param userAcc
     * @param maxResults
     * @param start
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<Poll> findAllPollByAccount(final Account account, final Integer maxResults, final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("owner", account));
        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        criteria.addOrder(Order.desc("createDate"));
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollByHashTagId(java.lang.Long, java.lang.Integer, java.lang.String)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPollByHashTagName(final String tagName, final Integer startResults,
            final Integer limitResults, final TypeSearchResult filterby, final SearchPeriods searchPeriods) {
        final DetachedCriteria detached = DetachedCriteria.forClass(Poll.class).createAlias("hashTags", "hashTags")
                .setProjection(Projections.id())
                .add(Subqueries.propertyIn("hashTags.hashTagId",
                        DetachedCriteria.forClass(HashTag.class, "hash").setProjection(Projections.id())
                                .add(Restrictions.in("hash.hashTag", new String[] { tagName }))));
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class, "poll");
        criteria.add(Subqueries.propertyIn("poll.pollId", detached));
        if (filterby.equals(TypeSearchResult.HASHTAG)) {
            criteria.addOrder(Order.desc("poll.createDate"));
        } else if (filterby.equals(TypeSearchResult.HASHTAGRATED)) {
            criteria.addOrder(Order.desc("numbervotes"));
        }
        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        calculateSearchPeriodsDates(searchPeriods, detached, "createDate");
        return (List<Poll>) filterByMaxorStart(criteria, limitResults, startResults);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollsbyHashTagNameAndDateRange(java.lang.String, java.lang.Integer, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPollsbyHashTagNameAndDateRange(final String tagName, final SearchPeriods period) {
        final DetachedCriteria detached = DetachedCriteria.forClass(Poll.class).createAlias("hashTags", "hashTags")
                .setProjection(Projections.id())
                .add(Subqueries.propertyIn("hashTags.hashTagId",
                        DetachedCriteria.forClass(HashTag.class, "hash").setProjection(Projections.id())
                                .add(Restrictions.in("hash.hashTag", new String[] { tagName }))));
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class, "poll");
        criteria.add(Subqueries.propertyIn("poll.pollId", detached));
        criteria.addOrder(Order.desc("poll.createDate"));
        calculateSearchPeriodsDates(period, criteria, "createDate");
        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        return (List<Poll>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.IPoll#getPollsRangeStats(java.lang.String,
     * org.encuestame.utils.enums.SearchPeriods)
     */
    @SuppressWarnings("unchecked")
    public List<Object[]> getPollsRangeStats(final String tagName, final SearchPeriods period) {
        final DetachedCriteria detached = DetachedCriteria.forClass(Poll.class).createAlias("hashTags", "hashTags")
                .setProjection(Projections.id())
                .add(Subqueries.propertyIn("hashTags.hashTagId",
                        DetachedCriteria.forClass(HashTag.class, "hash").setProjection(Projections.id())
                                .add(Restrictions.in("hash.hashTag", new String[] { tagName }))));
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class, "poll");
        criteria.add(Subqueries.propertyIn("poll.pollId", detached));
        criteria.addOrder(Order.desc("poll.createDate"));

        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        calculateSearchPeriodsDates(period, criteria, "createDate");
        ProjectionList projList = Projections.projectionList();
        projList.add(Projections.groupProperty("createDate"));
        projList.add(Projections.rowCount());
        criteria.setProjection(projList);
        return (List<Object[]>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollById(java.lang.Long)
     */
    public Poll getPollById(final Long pollId) {
        return (Poll) getHibernateTemplate().get(Poll.class, pollId);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollById(java.lang.Long, java.lang.String, boolean)
     */
    public Poll getPollById(final Long pollId, final String slugQuestion, final boolean encode) {
        final DetachedCriteria detached = DetachedCriteria.forClass(Poll.class).createAlias("question", "question");
        detached.add(Restrictions.eq("pollId", pollId));
        final String encodeString = encode ? RestFullUtil.encodeUTF8(slugQuestion) : slugQuestion;
        detached.add(Restrictions.eq("question.slugQuestion", encodeString));
        return (Poll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(detached));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollFolderById(java.lang.Long)
     */
    public PollFolder getPollFolderById(final Long folderId) {
        return getHibernateTemplate().get(PollFolder.class, folderId);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrieveResultPolls(java.lang.Long, java.lang.Long)
     */
    //TODO: MIGRATION
    @SuppressWarnings("unchecked")
    public List<Object[]> retrieveResultPolls(final Long pollId, final Long answerId) {
        final String pollResultsCounter = "select answer.questionAnswerId, answer.answer, answer.color,"
                + "count(poll.pollId) FROM PollResult " + "where poll.pollId= :pollId "
                + "group by answer.answer, answer.questionAnswerId, answer.color";
        return new ArrayList<Object[]>(
                currentSession().createQuery(pollResultsCounter).setParameter("pollId", pollId).list());
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollResults(org.encuestame.persistence.domain.survey.Poll)
     */
    @SuppressWarnings("unchecked")
    public List<PollResult> retrievePollResults(final Poll poll) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(PollResult.class);
        criteria.add(Restrictions.eq("poll", poll));
        return (List<PollResult>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getTotalVotesByPollIdAndDateRange(java.lang.Long, org.encuestame.utils.enums.SearchPeriods)
     */
    public Long getTotalVotesByPollIdAndDateRange(final Long pollId, final SearchPeriods period) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(PollResult.class);
        criteria.setProjection(Projections.rowCount());
        criteria.add(Restrictions.eq("poll.pollId", pollId));
        if (period != null) {
            calculateSearchPeriodsDates(period, criteria, "votationDate");
        }
        @SuppressWarnings("unchecked")
        List<PollResult> results = (List<PollResult>) getHibernateTemplate().findByCriteria(criteria);
        return (Long) (results.get(0) == null ? 0 : results.get(0));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollsByQuestionKeyword(java.lang.String, org.encuestame.persistence.domain.security.UserAccount, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPollsByQuestionKeyword(final String keyword, final UserAccount userAcc,
            final Integer maxResults, final Integer startOn) {
        log.debug("keyword " + keyword);

        @SuppressWarnings("rawtypes")
        final List<Poll> searchResult = (List) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(org.hibernate.Session session) {
                final Criteria criteria = session.createCriteria(Poll.class);
                //filter by account und .
                if (userAcc != null) {
                    criteria.add(Restrictions.eq("editorOwner", userAcc));
                } else {
                    // Retrieve without hidden polls
                    criteria.add(Restrictions.eq("isHidden", Boolean.FALSE));
                }
                //limit results
                if (maxResults != null) {
                    criteria.setMaxResults(maxResults.intValue());
                }
                //start on page x
                if (startOn != null) {
                    criteria.setFirstResult(startOn.intValue());
                }
                final String defaultField = "question.question";
                final String[] fields = new String[] { defaultField };
                final QueryBuilder<Poll> query = new QueryBuilder<>(getSessionFactory());
                List<Poll> results = query.build(criteria, keyword, maxResults, 0, fields, "question", Poll.class);
                return results;
            }
        });
        return (List<Poll>) searchResult;
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollByIdandUserId(java.lang.Long, org.encuestame.persistence.domain.security.UserAccount)
     */
    public Poll getPollById(final Long pollId, UserAccount userAcc) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("editorOwner", userAcc));
        criteria.add(Restrictions.eq("pollId", pollId));
        return (Poll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollFolderByIdandUser(java.lang.Long, org.encuestame.persistence.domain.security.UserAccount)
     */
    public PollFolder getPollFolderByIdandUser(final Long pollFolderId, final UserAccount userAcc) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(PollFolder.class);
        criteria.add(Restrictions.eq("createdBy", userAcc));
        criteria.add(Restrictions.eq("id", pollFolderId));
        return (PollFolder) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollByUserIdDate(java.util.Date, org.encuestame.persistence.domain.security.UserAccount, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPollByUserIdDate(final Date date, final UserAccount userAcc, final Integer maxResults,
            final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("editorOwner", userAcc));
        criteria.add(Restrictions.eq("isHidden", Boolean.FALSE));
        if (date != null) {
            criteria.add(Restrictions.between("createDate", date, getNextDayMidnightDate()));
        }
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollsByUserId(org.encuestame.persistence.domain.security.UserAccount, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> retrievePollsByUserId(final UserAccount userAcc, final Integer maxResults,
            final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        criteria.add(Restrictions.eq("editorOwner", userAcc));
        criteria.addOrder(Order.desc("createDate"));
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getMaxPollLikeVotesbyUser(java.lang.Long, java.util.Date, java.util.Date)
     */
    public Long getMaxPollLikeVotesbyUser(final Long userId, final Date dateFrom, final Date dateTo) {
        DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.setProjection(Projections.max("likeVote"));
        criteria.createAlias("editorOwner", "editorOwner");
        criteria.add(Restrictions.eq("editorOwner.uid", userId));
        criteria.add(Restrictions.between("createDate", dateFrom, dateTo));
        @SuppressWarnings("unchecked")
        List<Poll> results = (List<Poll>) getHibernateTemplate().findByCriteria(criteria);
        return (Long) (results.get(0) == null ? 0 : results.get(0));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPolls(java.lang.Integer, java.lang.Integer, java.util.Date)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getPolls(final Integer maxResults, final Integer start, final SearchPeriods range) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("publish", Boolean.TRUE));
        if (range != null) {
            //  criteria.add(Restrictions.gt("createdAt", range));
            calculateSearchPeriodsDates(range, criteria, "createDate");
        }
        criteria.addOrder(Order.desc("createDate"));
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrieveFavouritesPoll(java.lang.Long, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> retrieveFavouritesPoll(final UserAccount userAccount, final Integer maxResults,
            final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.createAlias("editorOwner", "editorOwner");
        criteria.add(Restrictions.eq("favourites", Boolean.TRUE));
        criteria.add(Restrictions.eq("editorOwner", userAccount));
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollToday(java.lang.Long, java.lang.Integer, java.lang.Integer)
     */
    public List<Poll> retrievePollToday(final Account owner, final Integer maxResults, final Integer start,
            final Date startDate) {
        return retrievePollByDate(owner, startDate, DateUtil.decreaseDateADay(startDate), maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollByDate(java.lang.Long, java.util.Date, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> retrievePollByDate(final Account owner, final Date initDate, final Date endDate,
            final Integer maxResults, final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.between("createDate", initDate, endDate));
        criteria.add(Restrictions.eq("owner", owner));
        return (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollLastWeek(java.lang.Long, java.lang.Integer, java.lang.Integer)
     */
    public List<Poll> retrievePollLastWeek(final Account owner, final Integer maxResults, final Integer start,
            final Date startDate) {
        return retrievePollByDate(owner, startDate, DateUtil.decreaseDateAsWeek(startDate), maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getTotalPollsbyUser(org.encuestame.persistence.domain.security.UserAccount, java.lang.Boolean)
     */
    public final Long getTotalPollsbyUser(final UserAccount user, final Boolean publishStatus) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.setProjection(Projections.rowCount());
        criteria.add(Restrictions.eq("editorOwner", user));
        criteria.add(Restrictions.eq("publish", publishStatus));
        @SuppressWarnings("unchecked")
        List<Poll> results = (List<Poll>) getHibernateTemplate().findByCriteria(criteria);
        log.trace("Retrieve total polls by  " + user.getUsername() + "--->" + results.size());
        return (Long) (results.get(0) == null ? 0 : results.get(0));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getListvalidateVoteIP(java.lang.String, org.encuestame.persistence.domain.survey.Poll)
     */
    @SuppressWarnings("unchecked")
    public List<PollResult> getListvalidateVoteIP(final String ip, final Poll poll) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(PollResult.class);
        criteria.setProjection(Projections.rowCount());
        criteria.add(Restrictions.eq("ipaddress", ip));
        criteria.add(Restrictions.eq("poll", poll));
        return (List<PollResult>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#validateVoteIP(java.lang.String, org.encuestame.persistence.domain.survey.Poll)
     */
    public Integer validateVoteIP(final String ip, final Poll poll) {
        final List<PollResult> total = this.getListvalidateVoteIP(ip, poll);
        Long longi = (Long) (total.get(0) == null ? 0 : total.get(0));
        return longi.intValue();
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getPollbyQuestion(java.lang.Long)
     */
    public Poll getPollbyQuestion(final Long questionId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.createAlias("question", "question");
        criteria.add(Restrictions.eq("question.qid", questionId));
        return (Poll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /**
    *
    * @param pollId
    * @param answerId
    * @return
    */
    @SuppressWarnings("unchecked")
    public List<Object[]> retrieveResultPollsbyAnswer(final Long pollId, final Long answerId) {
        final String pollResultsCounter = "select answer.questionAnswerId, answer.answer, answer.color,"
                + "count(poll.pollId) FROM PollResult "
                + "where poll.pollId= :pollId AND answer.questionAnswerId= :answerId "
                + "group by answer.answer, answer.questionAnswerId, answer.color";
        return (List<Object[]>) getHibernateTemplate().findByNamedParam(pollResultsCounter,
                new String[] { "pollId", "answerId" }, new Long[] { pollId, answerId });

    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.IPoll#retrievePollsByUserId(java.lang.
     * String, java.lang.Long, java.lang.Integer, java.lang.Integer,
     * java.lang.Boolean, java.lang.Boolean, java.lang.Boolean,
     * java.lang.Boolean, java.lang.String)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> retrievePollsByUserId(final PollSearchBean bean, final Long userId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        this.criteriaAdvancedSearch("owner", "uid", userId, criteria, bean.getIsComplete(), bean.getIsScheduled(),
                bean.getIsFavourite(), bean.getIsPublished(), bean.getIsHidden(), bean.getIsPasswordProtected(),
                bean.getKeyword(), bean.getPeriod());
        return (List<Poll>) filterByMaxorStart(criteria, bean.getMax(), bean.getStart());
    }

    /**
     *
     * @param property
     * @param property_value
     * @param itemId
     * @param criteria
     * @param isCompleted
     * @param isScheduled
     * @param isFavourite
     * @param isPublished
     * @param keyword
     * @param period
     */
    public void criteriaAdvancedSearch(final String property, final String property_value, final Object itemId,
            final DetachedCriteria criteria, final Boolean isCompleted, final Boolean isScheduled,
            final Boolean isFavourite, final Boolean isPublished, final Boolean isHidden,
            final Boolean isPasswordProtected, final String keyword, final String period) {
        // criteria.add(Restrictions.eq("editorOwner.uid", userId)); -- POLL
        criteria.createAlias(property, property);
        criteria.add(Restrictions.eq(property + "." + property_value, itemId));
        criteria.addOrder(Order.desc("createDate"));
        this.advancedPollSearchOptions(criteria, isCompleted, isScheduled, isFavourite, isPublished, isHidden,
                isPasswordProtected, keyword, period);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollsToday(org.encuestame.utils.web.search.PollSearchBean, java.lang.Long)
     */
    public List<Poll> retrievePollsToday(final PollSearchBean bean, final Long userId) {
        final Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return retrievePollByDate(bean, userId, cal.getTime());
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollByDate(org.encuestame.utils.web.search.PollSearchBean, java.lang.Long, java.util.Date)
     */
    public List<Poll> retrievePollByDate(final PollSearchBean bean, final Long userId, final Date initDate) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.createAlias("owner", "owner");
        criteria.add(Restrictions.eq("owner.id", userId));
        criteria.add(Restrictions.between("createDate", initDate, getNextDayMidnightDate()));
        return useAvancedSearch(criteria, bean);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrievePollsLastWeek(org.encuestame.utils.web.search.PollSearchBean, java.lang.Long)
     */
    public List<Poll> retrievePollsLastWeek(final PollSearchBean bean, final Long userId) {
        final Date initDate = DateUtil.decreaseDateAsWeek(Calendar.getInstance().getTime());
        return retrievePollByDate(bean, userId, initDate);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrieveFavouritesPoll(org.encuestame.utils.web.search.PollSearchBean, java.lang.Long)
     */
    public List<Poll> retrieveFavouritesPoll(final PollSearchBean bean, final Long userId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.createAlias("owner", "owner");
        criteria.add(Restrictions.eq("owner.uid", userId));
        return useAvancedSearch(criteria, bean);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#retrieveScheduledPoll(org.encuestame.utils.web.search.PollSearchBean, java.lang.Long)
     */
    public List<Poll> retrieveScheduledPoll(final PollSearchBean bean, final Long userId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.createAlias("owner", "owner");
        criteria.add(Restrictions.eq("owner.uid", userId));
        // To retrieve all and only scheduled Tweetpoll period should be = ALLTIME
        return useAvancedSearch(criteria, bean);
    }

    /**
     *
     * @param criteria
     * @param bean
     * @return
     */
    @SuppressWarnings("unchecked")
    private List<Poll> useAvancedSearch(final DetachedCriteria criteria, final PollSearchBean bean) {
        advancedPollSearchOptions(criteria, bean.getIsComplete(), bean.getIsScheduled(), bean.getIsFavourite(),
                bean.getIsPublished(), bean.getIsHidden(), bean.getIsPasswordProtected(), bean.getKeyword(),
                bean.getPeriod());
        return (List<Poll>) filterByMaxorStart(criteria, bean.getMax(), bean.getStart());
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.IPoll#getPollFolderByKeyword(java.lang
     * .String, org.encuestame.persistence.domain.security.UserAccount)
     */
    @SuppressWarnings("unchecked")
    public List<PollFolder> getPollFolderByKeyword(final String keyword, final UserAccount userAcc) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(PollFolder.class);

        criteria.add(Restrictions.eq("createdBy", userAcc));
        criteria.add(Restrictions.ilike("folderName", keyword, MatchMode.ANYWHERE));
        return (List<PollFolder>) filterByMaxorStart(criteria, 10, 0);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IPoll#getHiddenPollbyUser(java.lang.Boolean, org.encuestame.persistence.domain.security.UserAccount, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Poll> getHiddenPollbyUser(final Boolean isHidden, final UserAccount user, final Integer max,
            final Integer start) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.add(Restrictions.eq("isHidden", isHidden));
        criteria.add(Restrictions.eq("editorOwner", user));
        return (List<Poll>) filterByMaxorStart(criteria, max, start);
    }

}