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

Java tutorial

Introduction

Here is the source code for org.encuestame.persistence.dao.imp.TweetPollDao.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.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.encuestame.persistence.dao.ITweetPoll;
import org.encuestame.persistence.domain.HashTag;
import org.encuestame.persistence.domain.question.QuestionAnswer;
import org.encuestame.persistence.domain.security.Account;
import org.encuestame.persistence.domain.security.SocialAccount;
import org.encuestame.persistence.domain.security.UserAccount;
import org.encuestame.persistence.domain.survey.Poll;
import org.encuestame.persistence.domain.survey.Survey;
import org.encuestame.persistence.domain.tweetpoll.TweetPoll;
import org.encuestame.persistence.domain.tweetpoll.TweetPollFolder;
import org.encuestame.persistence.domain.tweetpoll.TweetPollResult;
import org.encuestame.persistence.domain.tweetpoll.TweetPollSavedPublishedStatus;
import org.encuestame.persistence.domain.tweetpoll.TweetPollSwitch;
import org.encuestame.utils.DateUtil;
import org.encuestame.utils.RestFullUtil;
import org.encuestame.utils.enums.SearchPeriods;
import org.encuestame.utils.enums.Status;
import org.encuestame.utils.enums.TypeSearchResult;
import org.encuestame.utils.social.SocialProvider;
import org.hibernate.HibernateException;
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.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.stereotype.Repository;

/**
 * TweetPoll Dao Implementation.
 *
 * @author Picado, Juan juanATencuestame.org
 * @since Feb 17, 2010 8:26:57 PM
 */
@Repository("tweetPollDao")
public class TweetPollDao extends AbstractHibernateDaoSupport implements ITweetPoll {

    private Log log = LogFactory.getLog(this.getClass());

    @Autowired
    public TweetPollDao(SessionFactory sessionFactory) {
        setSessionFactory(sessionFactory);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTweetPollById(java.lang.Long)
     */
    public TweetPoll getTweetPollById(final Long tweetPollId) throws HibernateException {
        return (TweetPoll) getHibernateTemplate().get(TweetPoll.class, tweetPollId);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTweetPollPublishedStatusbyId(java.lang.Long)
     */
    public TweetPollSavedPublishedStatus getTweetPollPublishedStatusbyId(final Long id) {
        return (TweetPollSavedPublishedStatus) getHibernateTemplate().get(TweetPollSavedPublishedStatus.class, id);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getPublicTweetPollById(java.lang.Long)
     */
    public TweetPoll getPublicTweetPollById(final Long tweetPollId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.add(Restrictions.eq("tweetPollId", tweetPollId));
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        return (TweetPoll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /**
     * Retrieve Tweets Poll by User Id.
     *
     * @param userId
     *            userId
     * @return list of tweet pools.
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrieveTweetsByUserId(final String keyWord, final Long userId, final Integer maxResults,
            final Integer start, final Boolean isCompleted, final Boolean isScheduled, final Boolean isPublished,
            final Boolean isFavourite, final String period) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        // removed because is the advancedSearchOptions should inject this value
        // criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        criteria.add(Restrictions.eq("tweetOwner.id", userId));
        criteria.addOrder(Order.desc("createDate"));
        advancedTweetPollSearchOptions(criteria, isCompleted, isScheduled, isFavourite, isPublished, keyWord,
                period);
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /**
     * Get TweetPoll by Question Name.
     *
     * @param keyWord
     *            keyword
     * @param userId
     *            user Id.
     * @return
     */
    @SuppressWarnings("unchecked")
    // TODO: migrate search to Hibernate Search.
    public List<TweetPoll> retrieveTweetsByQuestionName(final String keyWord, final Long userId,
            final Integer maxResults, final Integer start, final Boolean isCompleted, final Boolean isScheduled,
            final Boolean isFavourite, final Boolean isPublished, final String period) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        if (userId != null) {
            criteria.add(Restrictions.eq("tweetOwner.id", userId));
        }
        advancedTweetPollSearchOptions(criteria, isCompleted, isScheduled, isFavourite, isPublished, keyWord,
                period);
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#retrieveTweetPollByKeyword(
     * java.lang.String, java.lang.Integer, java.lang.Integer)
     */
    public List<TweetPoll> retrieveTweetPollByKeyword(final String keyword, final Integer start,
            final Integer maxResults) {

        return this.retrieveTweetsByQuestionName(keyword, null, maxResults, start, false, false, false, true, null);
    }

    /**
     * Retrieve TweetPoll Today.
     *
     * @param keyWord
     * @param userId
     * @return
     */
    public List<TweetPoll> retrieveTweetPollToday(final Account account, final Integer maxResults,
            final Integer start, final Boolean isCompleted, final Boolean isScheduled, final Boolean isFavourite,
            final Boolean isPublished, final String keyword, final String period) {
        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 retrieveTweetPollByDate(account, maxResults, start, isCompleted, isScheduled, isFavourite,
                isPublished, keyword, period, cal.getTime());
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#retrieveTweetPollByDate(org
     * .encuestame.persistence.domain.security.Account, java.util.Date,
     * java.lang.Integer, java.lang.Integer, java.lang.Boolean,
     * java.lang.Boolean, java.lang.Boolean, java.lang.Boolean,
     * java.lang.String, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrieveTweetPollByDate(final Account account, final Integer maxResults,
            final Integer start, final Boolean isCompleted, final Boolean isScheduled, final Boolean isFavourite,
            final Boolean isPublished, final String keyword, final String period, final Date initDate) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        criteria.add(Restrictions.eq("tweetOwner", account));
        criteria.add(Restrictions.between("createDate", initDate, getNextDayMidnightDate()));
        advancedTweetPollSearchOptions(criteria, isCompleted, isScheduled, isFavourite, isPublished, keyword,
                period);
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#retrieveTweetPollLastWeek(org
     * .encuestame.persistence.domain.security.Account, java.lang.Integer,
     * java.lang.Integer, java.lang.Boolean, java.lang.Boolean,
     * java.lang.Boolean, java.lang.Boolean, java.lang.String,
     * java.lang.Integer)
     */
    public List<TweetPoll> retrieveTweetPollLastWeek(final Account account, final Integer maxResults,
            final Integer start, final Boolean isCompleted, final Boolean isScheduled, final Boolean isFavourite,
            final Boolean isPublished, final String keyword, final String period) {
        final Date initDate = DateUtil.decreaseDateAsWeek(Calendar.getInstance().getTime());
        return retrieveTweetPollByDate(account, maxResults, start, isCompleted, isScheduled, isFavourite,
                isPublished, keyword, period, initDate);
    }

    /**
     * Retrieve Favourites TweetPolls.
     *
     * @param keyWord
     * @param userId
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrieveFavouritesTweetPoll(final Account account, final Integer maxResults,
            final Integer start, final Boolean isCompleted, final Boolean isScheduled, final Boolean isFavourite,
            final Boolean isPublished, final String keyword, final String period) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        criteria.add(Restrictions.eq("tweetOwner", account));
        advancedTweetPollSearchOptions(criteria, isCompleted, isScheduled, Boolean.TRUE, isPublished, keyword,
                period);
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /**
     * Retrieve Favourites TweetPolls.
     *
     * @param keyWord
     * @param userId
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrieveScheduledTweetPoll(final Long userId, final Integer maxResults,
            final Integer start, final Boolean isCompleted, final Boolean isScheduled, final Boolean isFavourite,
            final Boolean isPublished, final String keyword, final String period) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        criteria.add(Restrictions.eq("tweetOwner.uid", userId));
        // To retrieve all and only scheduled Tweetpoll period should be = ALLTIME
        advancedTweetPollSearchOptions(criteria, isCompleted, isScheduled, isFavourite, isPublished, keyword,
                period);
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.encuestame.persistence.dao.ITweetPoll#
     * retrievePublishedUnpublishedTweetPoll
     * (org.encuestame.persistence.domain.security.Account, java.lang.Integer,
     * java.lang.Integer, java.lang.Boolean)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrievePublishedUnpublishedTweetPoll(final Account account, final Integer maxResults,
            final Integer start, final Boolean isPublished) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        criteria.add(Restrictions.eq("publishTweetPoll", isPublished));
        criteria.add(Restrictions.eq("tweetOwner", account));
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#retrieveCompletedTweetPoll(
     * org.encuestame.persistence.domain.security.Account, java.lang.Integer,
     * java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrieveCompletedTweetPoll(final Account account, final Integer maxResults,
            final Integer start, final Boolean isComplete) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("tweetOwner", "tweetOwner");
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        criteria.add(Restrictions.eq("tweetOwner", account));
        criteria.add(Restrictions.eq("completed", isComplete));
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /**
     * Retrieve {@link TweetPollSwitch} by code.
     *
     * @param tweetCode
     *            tweetCode code.
     * @return switch {@link TweetPollSwitch}
     */
    public TweetPollSwitch retrieveTweetsPollSwitch(final String tweetCode) {
        log.debug("retrieveTweetsPollSwitch codeTweet:" + tweetCode);
        return this.searchByParamStringTweetPollSwitch("codeTweet", tweetCode);
    }

    /**
     * Search By Param String {@link TweetPollSwitch}.
     *
     * @param param
     *            param
     * @param value
     *            value
     * @return
     */
    private TweetPollSwitch searchByParamStringTweetPollSwitch(final String param, final String value) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSwitch.class);
        criteria.add(Restrictions.eq(param, value));
        return (TweetPollSwitch) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#validateTweetPollResultsIP(
     * java.lang.String, org.encuestame.persistence.domain.tweetpoll.TweetPoll)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollResult> validateTweetPollResultsIP(final String ip, final TweetPoll tweetPoll) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollResult.class);
        criteria.add(Restrictions.eq("ipVote", ip));
        criteria.createAlias("tweetPollSwitch", "tpSwitch");
        criteria.add(Restrictions.eq("tpSwitch.tweetPoll", tweetPoll));
        return (List<TweetPollResult>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * Get Results By {@link TweetPoll} && {@link QuestionAnswer}.
     *
     * @param tweetPoll
     *            {@link TweetPoll}
     * @param answers
     *            {@link QuestionAnswer}
     * @return List of {@link TweetPollResult}
     */
    @SuppressWarnings("unchecked")
    public List<Object[]> getResultsByTweetPoll(final TweetPoll tweetPoll, final QuestionAnswer answers) {
        //FIXME: please add short url of the list into the select sentence
        return (List<Object[]>) getHibernateTemplate().findByNamedParam(
                "select tweetPollSwitch.answers.answer, count(tweetPollResultId) from TweetPollResult "
                        + "where tweetPollSwitch.tweetPoll = :tweetPoll and tweetPollSwitch.answers = :answer group by tweetPollSwitch.answers.answer",
                new String[] { "tweetPoll", "answer" }, new Object[] { tweetPoll, answers });
    }

    /**
     *
     * @param tweetPollId
     * @param answerId
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<Object[]> getResultsByTweetPoll(final Long tweetPollId, final Long answerId) {
        return (List<Object[]>) getHibernateTemplate().findByNamedParam(
                " select tweetPollSwitch.answers.answer, tweetPollSwitch.answers.color, count(tweetPollResultId)"
                        + " from TweetPollResult " + " where tweetPollSwitch.tweetPoll.tweetPollId = :tweetPoll "
                        + " and tweetPollSwitch.answers.questionAnswerId = :answer group by tweetPollSwitch.answers.answer, tweetPollSwitch.answers.color",
                new String[] { "tweetPoll", "answer" }, new Object[] { tweetPollId, answerId });
    }

    /**
     * Get List of Switch Answers by TweetPoll.
     *
     * @param tweetPoll
     *            {@link TweetPoll}.
     * @return List of {@link TweetPollSwitch}
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollSwitch> getListAnswesByTweetPoll(final TweetPoll tweetPoll) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSwitch.class);
        criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
        return (List<TweetPollSwitch>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getAnswerTweetSwitch(org.encuestame
     * .persistence.domain.tweetpoll.TweetPoll,
     * org.encuestame.persistence.domain.question.QuestionAnswer)
     */
    public TweetPollSwitch getAnswerTweetSwitch(final TweetPoll tweetPoll, final QuestionAnswer questionAnswer) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSwitch.class);
        criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
        criteria.add(Restrictions.eq("answers", questionAnswer));
        return (TweetPollSwitch) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getAnswerTweetSwitch(org.encuestame
     * .persistence.domain.question.QuestionAnswer)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollSwitch> getAnswerTweetSwitch(final QuestionAnswer questionAnswer) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSwitch.class);
        criteria.add(Restrictions.eq("answers", questionAnswer));
        return (List<TweetPollSwitch>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * Get Votes By {@link TweetPollSwitch}..
     *
     * @param pollSwitch
     *            {@link TweetPollSwitch}..
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<Long> getVotesByAnswer(final TweetPollSwitch pollSwitch) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollResult.class);
        criteria.setProjection(Projections.rowCount());
        criteria.add(Restrictions.eq("tweetPollSwitch", pollSwitch));
        return (List<Long>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * Get Total Votes By {@link TweetPoll}.
     *
     * @param tweetPoll
     *            {@link TweetPoll}.
     * @return List of Votes.
     */
    public List<Object[]> getTotalVotesByTweetPoll(final Long tweetPollId) {
        final List<Object[]> result = new ArrayList<Object[]>();
        final List<TweetPollSwitch> answers = this.getListAnswesByTweetPoll(this.getTweetPollById(tweetPollId));
        for (TweetPollSwitch tweetPollSwitch : answers) {
            final List<Long> answerResult = this.getVotesByAnswer(tweetPollSwitch);
            final Object[] objects = { tweetPollSwitch.getAnswers().getAnswer(), answerResult.get(0) };
            result.add(objects);
        }
        return result;
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTotalVotesByTweetPollId(java.lang.Long)
     */
    public Long getTotalVotesByTweetPollId(final Long tweetPollId) {
        Long totalvotes = 0L;
        // Type YES-NO
        //1- Retrieve TweetpollSwitch list with answers for this tweetpoll
        final List<TweetPollSwitch> answers = this.getListAnswesByTweetPoll(this.getTweetPollById(tweetPollId));
        for (TweetPollSwitch tweetPollSwitch : answers) {
            //2 - Total votes by answers already voted.
            final List<Long> answerResult = this.getVotesByAnswer(tweetPollSwitch); // Count
            // Sum already votes
            for (Long objects : answerResult) {
                if (objects != null) {
                    totalvotes += objects;
                }
            }
            log.info("Total Votes: " + totalvotes);
        }
        return totalvotes;
    }

    /**
     * Retrieve Tweet Polls Folders By UserId
     *
     * @param userId
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollFolder> retrieveTweetPollFolderByAccount(final Account account) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollFolder.class);
        criteria.add(Restrictions.eq("users", account));
        criteria.add(Restrictions.eq("status", org.encuestame.utils.enums.Status.ACTIVE));
        return (List<TweetPollFolder>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * Retrieve TweetPoll by Folder
     *
     * @param userId
     * @param folderId
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> retrieveTweetPollByFolder(final Long userId, final Long folderId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.add(Restrictions.eq("tweetOwner.uid", userId));
        criteria.add(Restrictions.eq("tweetPollFolder.id", folderId));
        return (List<TweetPoll>) getHibernateTemplate().findByCriteria(criteria);
    }

    /**
     * Get TweetPoll Folder By Id.
     *
     * @param folderId
     * @return
     */
    public TweetPollFolder getTweetPollFolderById(final Long folderId) {
        return getHibernateTemplate().get(TweetPollFolder.class, folderId);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetPollFolderByIdandUser
     * (java.lang.Long, org.encuestame.persistence.domain.security.Account)
     */
    public TweetPollFolder getTweetPollFolderByIdandUser(final Long folderId, final Account account) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollFolder.class);
        criteria.add(Restrictions.eq("users", account));
        criteria.add(Restrictions.eq("status", org.encuestame.utils.enums.Status.ACTIVE));
        criteria.add(Restrictions.eq("id", folderId));
        return (TweetPollFolder) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetPollByIdandUserId(java
     * .lang.Long, java.lang.Long)
     */
    public TweetPoll getTweetPollByIdandUserId(final Long tweetPollId, final Long userId) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.add(Restrictions.eq("tweetOwner.uid", userId));
        criteria.add(Restrictions.eq("tweetPollId", tweetPollId));
        return (TweetPoll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetPollByIdandSlugName
     * (java.lang.Long, java.lang.String)
     */
    public TweetPoll getTweetPollByIdandSlugName(final Long tweetPollId, final String slugName)
            throws UnsupportedEncodingException {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("question", "q");
        criteria.add(Restrictions.eq("tweetPollId", tweetPollId));
        criteria.add(Restrictions.eq("q.slugQuestion", RestFullUtil.encodeUTF8(slugName)));
        return (TweetPoll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetpollByHashTagName(java
     * .lang.String)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> getTweetpollByHashTagName(final String tagName, final Integer startResults,
            final Integer limitResults, final TypeSearchResult filterby, final SearchPeriods periods) {
        final DetachedCriteria detached = DetachedCriteria.forClass(TweetPoll.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(TweetPoll.class, "tweetPoll");
        criteria.add(Subqueries.propertyIn("tweetPoll.tweetPollId", detached));
        //if filters are defined.
        if (filterby != null) {
            if (filterby.equals(TypeSearchResult.HASHTAG)) {
                criteria.addOrder(Order.desc("tweetPoll.createDate"));
            } else if (filterby.equals(TypeSearchResult.HASHTAGRATED)) {
                criteria.addOrder(Order.desc("numbervotes"));
            }
        }
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        calculateSearchPeriodsDates(periods, detached, "createDate");
        return (List<TweetPoll>) filterByMaxorStart(criteria, limitResults, startResults);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#checkIfTweetPollHasHashTag(java
     * .lang.String, org.encuestame.utils.enums.SearchPeriods, java.lang.Long)
     */
    public TweetPoll checkIfTweetPollHasHashTag(final String tagName, final SearchPeriods periods,
            final Long tpoll) {
        final DetachedCriteria detached = DetachedCriteria.forClass(TweetPoll.class)
                .createAlias("hashTags", "hashTags").setProjection(Projections.id())
                .add(Restrictions.eq("tweetPoll.tweetPollId", tpoll))
                .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(TweetPoll.class, "tweetPoll");
        criteria.add(Subqueries.propertyIn("tweetPoll.tweetPollId", detached));
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        calculateSearchPeriodsDates(periods, detached, "createDate");
        return (TweetPoll) DataAccessUtils.uniqueResult(getHibernateTemplate().findByCriteria(criteria));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTweetPollsbyHashTagNameAndDateRange(java.lang.String, java.lang.Integer, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    //FUTURE: this method return a List<Object[]> instead List<TweetPoll>
    public List<TweetPoll> getTweetPollsbyHashTagNameAndDateRange(final String tagName,
            final SearchPeriods period) {
        final DetachedCriteria detached = DetachedCriteria.forClass(TweetPoll.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(TweetPoll.class, "tweetPoll");
        criteria.add(Subqueries.propertyIn("tweetPoll.tweetPollId", detached));
        criteria.addOrder(Order.desc("tweetPoll.createDate"));
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        ProjectionList projList = Projections.projectionList();
        projList.add(Projections.groupProperty("createDate"));
        projList.add(Projections.rowCount());
        criteria.setProjection(projList);
        // calculateSearchPeriodsDates(period, criteria, "createDate");

        return (List<TweetPoll>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getLinksByTweetPoll(org.encuestame
     * .persistence.domain.tweetpoll.TweetPoll,
     * org.encuestame.persistence.domain.survey.Survey,
     * org.encuestame.persistence.domain.survey.Poll,
     * org.encuestame.utils.enums.TypeSearchResult)
     */
    @SuppressWarnings("unchecked")
    //TODO: please use FrontEndDao new method.
    /*
     * List<TweetPollSavedPublishedStatus> getLinksByHomeItem replace this method.
     */
    public List<TweetPollSavedPublishedStatus> getLinksByTweetPoll(final TweetPoll tweetPoll, final Survey survey,
            final Poll poll, final TypeSearchResult itemType) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
            // criteria.addOrder(Order.desc("tweetPoll.createDate"));
        } else if (itemType.equals(TypeSearchResult.POLL)) {
            criteria.add(Restrictions.eq("poll", poll));
            // criteria.addOrder(Order.desc("survey.createdAt"));
        } else if (itemType.equals(TypeSearchResult.SURVEY)) {
            criteria.add(Restrictions.eq("survey", survey));
            // criteria.addOrder(Order.desc("poll.createdAt"));
        } else {
            log.error("Item type not valid: " + itemType);
        }
        criteria.addOrder(Order.desc("publicationDateTweet"));
        criteria.add(Restrictions.isNotNull("apiType"));
        criteria.add(Restrictions.isNotNull("tweetId"));
        criteria.add(Restrictions.eq("status", Status.SUCCESS));
        return (List<TweetPollSavedPublishedStatus>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getAllLinks(org.encuestame.persistence.domain.tweetpoll.TweetPoll, org.encuestame.persistence.domain.survey.Survey, org.encuestame.persistence.domain.survey.Poll, org.encuestame.utils.enums.TypeSearchResult)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollSavedPublishedStatus> getAllLinks(final TweetPoll tweetPoll, final Survey survey,
            final Poll poll, final TypeSearchResult itemType) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
            // criteria.addOrder(Order.desc("tweetPoll.createDate"));
        } else if (itemType.equals(TypeSearchResult.POLL)) {
            criteria.add(Restrictions.eq("poll", poll));
            // criteria.addOrder(Order.desc("survey.createdAt"));
        } else if (itemType.equals(TypeSearchResult.SURVEY)) {
            criteria.add(Restrictions.eq("survey", survey));
            // criteria.addOrder(Order.desc("poll.createdAt"));
        } else {
            log.error("Item type not valid: " + itemType);
        }
        criteria.addOrder(Order.desc("publicationDateTweet"));
        return (List<TweetPollSavedPublishedStatus>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getSocialLinksByTweetPollSearch(org.encuestame.persistence.domain.tweetpoll.TweetPoll, org.encuestame.utils.enums.TypeSearchResult, java.util.List, java.util.List)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollSavedPublishedStatus> getSocialLinksByTweetPollSearch(final TweetPoll tweetPoll,
            final TypeSearchResult itemType, final List<SocialProvider> splist,
            final List<SocialAccount> socialAccounts) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        criteria.createAlias("socialAccount", "socialAccount");
        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
            criteria.add(Restrictions.isNotNull("tweetId"));
            criteria.add(Restrictions.eq("status", Status.SUCCESS));
            if (splist.size() > 0) {
                criteria.add(Restrictions.in("apiType", splist));
            }
            if (socialAccounts.size() > 0) {
                criteria.add(Restrictions.in("socialAccount", socialAccounts));
            }
        }
        return (List<TweetPollSavedPublishedStatus>) getHibernateTemplate().findByCriteria(criteria);
    }

    @SuppressWarnings("unchecked")
    public List<TweetPollSavedPublishedStatus> searchSocialLinksbyType(final TweetPoll tweetPoll, final Poll poll,
            final TypeSearchResult itemType, final List<SocialProvider> splist,
            final List<SocialAccount> socialAccounts) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        criteria.createAlias("socialAccount", "socialAccount");

        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
            // Revisar bien estos valores porque sino encuentra nada va a evaluarlos y regresara valores
            criteriaSearchSocialLinksByType(criteria, splist, socialAccounts);

        } else if (itemType.equals(TypeSearchResult.POLL)) {
            criteria.add(Restrictions.eq("poll", poll));
            criteriaSearchSocialLinksByType(criteria, splist, socialAccounts);
        }

        return (List<TweetPollSavedPublishedStatus>) getHibernateTemplate().findByCriteria(criteria);
    }

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

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetPolls(java.lang.Integer
     * , java.lang.Integer, java.util.Date)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> getTweetPolls(final Integer maxResults, final Integer start, final Date range) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        // criteria.add(Restrictions.gt("createDate", range));
        criteria.addOrder(Order.desc("createDate"));
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTweetPollByUsername(java.lang.Integer, org.encuestame.persistence.domain.security.UserAccount)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPoll> getTweetPollByUsername(final Integer limitResults, final UserAccount account) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        criteria.add(Restrictions.eq("editorOwner", account));
        criteria.addOrder(Order.desc("createDate"));
        return (List<TweetPoll>) filterByMaxorStart(criteria, limitResults, 0);
    }

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

    @SuppressWarnings("unchecked")
    public Long getSocialLinksByType(final TweetPoll tweetPoll, final Survey survey, final Poll poll,
            final TypeSearchResult itemType) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        criteria.setProjection(Projections.rowCount());
        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
        } else if (itemType.equals(TypeSearchResult.SURVEY)) {
            criteria.createAlias("survey", "survey");
            criteria.add(Restrictions.eq("survey", survey));
            // criteria.addOrder(Order.desc("survey.createdAt"));
        } else if (itemType.equals(TypeSearchResult.POLL)) {
            criteria.add(Restrictions.eq("poll", poll));
            // criteria.addOrder(Order.desc("poll.createdAt"));
        } else {
            log.error("Item type not valid: " + itemType);
        }
        criteria.add(Restrictions.isNotNull("apiType"));
        criteria.add(Restrictions.isNotNull("tweetId"));
        criteria.add(Restrictions.eq("status", Status.SUCCESS));

        List<TweetPollSavedPublishedStatus> results = (List<TweetPollSavedPublishedStatus>) getHibernateTemplate()
                .findByCriteria(criteria);
        log.debug("Retrieve total Social Links:" + "--->" + results.size());
        return (Long) (results.get(0) == null ? 0 : results.get(0));

    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getSocialLinksByTypeAndDateRange(org.encuestame.persistence.domain.tweetpoll.TweetPoll, org.encuestame.persistence.domain.survey.Survey, org.encuestame.persistence.domain.survey.Poll, org.encuestame.utils.enums.TypeSearchResult, java.lang.Integer, java.lang.Integer, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollSavedPublishedStatus> getSocialLinksByTypeAndDateRange(final TweetPoll tweetPoll,
            final Survey survey, final Poll poll, final TypeSearchResult itemType) {

        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.createAlias("tweetPoll", "tweetPoll");
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));

        } else if (itemType.equals(TypeSearchResult.SURVEY)) {
            criteria.createAlias("survey", "survey");
            criteria.add(Restrictions.eq("survey", survey));

        } else if (itemType.equals(TypeSearchResult.POLL)) {
            criteria.add(Restrictions.eq("poll", poll));

        } else {
            log.error("Item type not valid: " + itemType);
        }

        criteria.add(Restrictions.isNotNull("apiType"));
        criteria.add(Restrictions.isNotNull("tweetId"));
        criteria.add(Restrictions.eq("status", Status.SUCCESS));
        return (List<TweetPollSavedPublishedStatus>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTotalVotesByTweetPollIdAndDateRange(java.lang.Long, java.lang.Integer)
     */
    public Long getTotalVotesByTweetPollIdAndDateRange(final Long tweetPollId, final String period) {
        Long totalvotes = 0L;
        final TweetPoll tpoll = this.getTweetPollById(tweetPollId);
        final List<TweetPollSwitch> tpSwitchAnswers = this.getListAnswersByTweetPollAndDateRange(tpoll);
        final SearchPeriods searchPeriods = SearchPeriods.getPeriodString(period);
        for (TweetPollSwitch tweetPollSwitch : tpSwitchAnswers) {
            totalvotes += this.getTotalTweetPollResultByTweetPollSwitch(tweetPollSwitch, searchPeriods);
            log.info("Total Votes: " + totalvotes);
        }
        return totalvotes;
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTotalTweetPollResultByTweetPollSwitch(org.encuestame.persistence.domain.tweetpoll.TweetPollSwitch)
     */
    public final Long getTotalTweetPollResultByTweetPollSwitch(final TweetPollSwitch pollSwitch,
            final SearchPeriods period) {

        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollResult.class);
        criteria.setProjection(Projections.rowCount());
        criteria.add(Restrictions.eq("tweetPollSwitch", pollSwitch));
        calculateSearchPeriodsDates(period, criteria, "tweetResponseDate");
        @SuppressWarnings("unchecked")
        List<TweetPollResult> results = (List<TweetPollResult>) getHibernateTemplate().findByCriteria(criteria);
        log.debug("Retrieve total tweetPolls by  " + pollSwitch.getAnswers().getAnswer() + "--->" + results.size());
        return (Long) (results.get(0) == null ? 0 : results.get(0));
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getListAnswersByTweetPollAndDateRange(org.encuestame.persistence.domain.tweetpoll.TweetPoll, java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollSwitch> getListAnswersByTweetPollAndDateRange(final TweetPoll tweetPoll) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSwitch.class);
        criteria.createAlias("tweetPoll", "tweetPoll");
        criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
        return (List<TweetPollSwitch>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.ITweetPoll#getTweetPollResultsByTweetPollSwitch(org.encuestame.persistence.domain.tweetpoll.TweetPollSwitch)
     */
    @SuppressWarnings("unchecked")
    public final List<TweetPollResult> getTweetPollResultsByTweetPollSwitch(final TweetPollSwitch pollSwitch) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollResult.class);
        criteria.add(Restrictions.eq("tweetPollSwitch", pollSwitch));
        return (List<TweetPollResult>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see org.encuestame.persistence.dao.ITweetPoll#
     * retrieveTweetPollsBySearchRadiusOfGeoLocation(double, double, double,
     * double, int, org.encuestame.utils.enums.TypeSearchResult,
     * org.encuestame.utils.enums.SearchPeriods)
     */
    public List<Object[]> retrieveTweetPollsBySearchRadiusOfGeoLocation(final double latitude,
            final double longitude, final double distance, final double radius, final int maxItems,
            final TypeSearchResult type, final SearchPeriods period) {
        String queryStr = "";
        final DateTime startDate = this.calculateSearchPeriodForGeo(period);
        final DateTime endDate = new DateTime();
        if (type.equals(TypeSearchResult.TWEETPOLL)) {
            queryStr = this.getQueryStringForGeoLocation("tweetPollId", "locationLatitude", "locationLongitude",
                    "question.question", "TweetPoll", "createDate");
        } else if (type.equals(TypeSearchResult.POLL)) {
            queryStr = this.getQueryStringForGeoLocation("pollId", "locationLatitude", "locationLongitude",
                    "question.question", "Poll", "createDate");
        } else if (type.equals(TypeSearchResult.SURVEY)) {
            queryStr = this.getQueryStringForGeoLocation("sid", "locationLatitude", "locationLongitude", "name",
                    "Survey", "createDate");
        } else if (type.equals(TypeSearchResult.HASHTAG)) {
            // TODO: Define how to should store geolocations for hashtags, maybe
            // in tweetpoll_hashtags
        } else {
            log.error("Item type not valid: " + type);
        }
        //calculateSearchPeriodsDates(period, criteria, "tweetResponseDate");
        getHibernateTemplate().setMaxResults(maxItems);
        return this.findByNamedParamGeoLocationItems(queryStr, latitude, longitude, distance, radius, maxItems,
                startDate.toDate(), endDate.toDate());
    }

    // NOTE: Missing search by Social Links and text
    @SuppressWarnings("unchecked")
    public List<TweetPoll> advancedSearch(final Boolean isPublished, final Boolean isComplete,
            final Boolean favourites, final Boolean scheduled, final Account user, final Integer start,
            final Integer max, final Integer period, final String keyword) {
        final SearchPeriods searchPeriods = SearchPeriods.getPeriodString(period.toString());
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("question", "question");
        criteria.add(Restrictions.like("question.question", keyword, MatchMode.ANYWHERE));

        criteria.add(Restrictions.eq("completed", isComplete));
        criteria.add(Restrictions.eq("scheduleTweetPoll", scheduled));
        criteria.add(Restrictions.eq("publishTweetPoll", isPublished));
        criteria.add(Restrictions.eq("favourites", favourites));
        criteria.add(Restrictions.eq("tweetOwner", user));
        calculateSearchPeriodsDates(searchPeriods, criteria, "createDate");
        return (List<TweetPoll>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetPollsRangeStats(java
     * .lang.String, org.encuestame.utils.enums.SearchPeriods)
     */
    @SuppressWarnings("unchecked")
    public List<Object[]> getTweetPollsRangeStats(final String tagName, final SearchPeriods period) {
        final DetachedCriteria detached = DetachedCriteria.forClass(TweetPoll.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(TweetPoll.class, "tweetPoll");
        criteria.add(Subqueries.propertyIn("tweetPoll.tweetPollId", detached));
        criteria.addOrder(Order.desc("tweetPoll.createDate"));
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE));
        ProjectionList projList = Projections.projectionList();
        projList.add(Projections.groupProperty("createDate"));
        projList.add(Projections.rowCount());
        criteria.setProjection(projList);
        calculateSearchPeriodsDates(period, criteria, "createDate");

        return (List<Object[]>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.ITweetPoll#getTweetPollFolderByKeyword
     * (java.lang.String,
     * org.encuestame.persistence.domain.security.UserAccount)
     */
    @SuppressWarnings("unchecked")
    public List<TweetPollFolder> getTweetPollFolderByKeyword(final String keyword, final UserAccount userAcc) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollFolder.class);
        criteria.add(Restrictions.eq("createdBy", userAcc));
        criteria.add(Restrictions.ilike("folderName", keyword, MatchMode.ANYWHERE));
        return (List<TweetPollFolder>) filterByMaxorStart(criteria, 10, 0);
    }

}