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

Java tutorial

Introduction

Here is the source code for org.encuestame.persistence.dao.imp.FrontEndDao.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.List;

import org.apache.commons.collections.ListUtils;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.encuestame.persistence.dao.IFrontEndDao;
import org.encuestame.persistence.dao.IPoll;
import org.encuestame.persistence.dao.ITweetPoll;
import org.encuestame.persistence.domain.AccessRate;
import org.encuestame.persistence.domain.HashTag;
import org.encuestame.persistence.domain.Hit;
import org.encuestame.persistence.domain.question.Question;
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.TweetPollSavedPublishedStatus;
import org.encuestame.utils.DateUtil;
import org.encuestame.utils.enums.HitCategory;
import org.encuestame.utils.enums.SearchPeriods;
import org.encuestame.utils.enums.Status;
import org.encuestame.utils.enums.TypeSearchResult;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.stereotype.Repository;

/**
 * Front End Dao.
 * @author Picado, Juan juanATencuestame.org
 * @since Oct 16, 2010 10:53:26 PM
 */
@Repository("frontEndDao")
public class FrontEndDao extends AbstractHibernateDaoSupport implements IFrontEndDao {

    /** Represent All Items in the time. **/
    private final Integer WITHOUT_FIRST_RESULTS = -1;

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

    @Autowired
    private ITweetPoll tweetPoll;

    /** {@link PollDao}. **/
    @Autowired
    private IPoll poll;

    /**
     * Get TweetPoll Front End.
     * @param period date period
     * @param firstResult first results
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    @SuppressWarnings("unchecked")
    public final List<TweetPoll> getTweetPollFrontEnd(final SearchPeriods period, final Integer start,
            final Integer maxResults, final Integer firstResult) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPoll.class);
        criteria.createAlias("question", "question");
        calculateSearchPeriodsDates(period, criteria, "createDate");
        criteria.add(Restrictions.eq("publishTweetPoll", Boolean.TRUE)); //should be published
        criteria.add(Restrictions.gt("relevance", 0L));
        criteria.addOrder(Order.desc("relevance"));
        criteria.addOrder(Order.desc("createDate"));
        return (List<TweetPoll>) filterByMaxorStart(criteria, maxResults, start);
        //return getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
    }

    /**
     * Get Poll on Front End
     * @param period period
     * @param maxResults maxResults
     * @param firstResult firstResults.
     * @return list of poll.
     */
    @SuppressWarnings("unchecked")
    public final List<Poll> getPollFrontEnd(final SearchPeriods period, final Integer start,
            final Integer maxResults, final Integer firstResult) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Poll.class);
        criteria.createAlias("question", "question");
        calculateSearchPeriodsDates(period, criteria, "createDate");
        criteria.add(Restrictions.gt("relevance", 0L));
        criteria.add(Restrictions.eq("publish", Boolean.TRUE)); //should be published
        criteria.add(Restrictions.or(Restrictions.eq("isHidden", Boolean.FALSE), Restrictions.isNull("isHidden")));
        criteria.add(Restrictions.isNotNull("isPasswordProtected"));
        criteria.add(Restrictions.isNull("passProtection"));
        //criteria.add(Restrictions.isEmpty("passProtection"));
        criteria.addOrder(Order.desc("createDate"));
        criteria.addOrder(Order.desc("relevance"));
        List<Poll> polls = (List<Poll>) filterByMaxorStart(criteria, maxResults, start);
        return polls;
    }

    /*
     *
     */
    @SuppressWarnings("unchecked")
    public final List<Survey> getSurveyFrontEnd(final SearchPeriods period, final Integer start,
            final Integer maxResults, final Integer firstResult) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Survey.class);
        //criteria.createAlias("question", "question");
        // TODO: Complete method, adding criteria params

        calculateSearchPeriodsDates(period, criteria, "createDate");
        criteria.add(Restrictions.gt("relevance", 0L));
        criteria.addOrder(Order.desc("relevance"));
        criteria.addOrder(Order.desc("createDate"));
        return (List<Survey>) filterByMaxorStart(criteria, maxResults, start);
    }

    /**
     * Get TweetPoll Last 24 Hours.
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<TweetPoll> getTweetPollFrontEndLast24(final Integer start, final Integer maxResults) {
        return this.getTweetPollFrontEnd(SearchPeriods.TWENTYFOURHOURS, start, maxResults,
                this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll Last 7 Days
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<TweetPoll> getTweetPollFrontEndLast7Days(final Integer start, final Integer maxResults) {
        return this.getTweetPollFrontEnd(SearchPeriods.SEVENDAYS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll Last 30 Days
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<TweetPoll> getTweetPollFrontEndLast30Days(final Integer start, final Integer maxResults) {
        return this.getTweetPollFrontEnd(SearchPeriods.THIRTYDAYS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll all time.
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<TweetPoll> getTweetPollFrontEndAllTime(final Integer start, final Integer maxResults) {
        return this.getTweetPollFrontEnd(SearchPeriods.ALLTIME, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get Poll Last 24 Hours.
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Poll> getPollFrontEndLast24(final Integer start, final Integer maxResults) {
        return this.getPollFrontEnd(SearchPeriods.TWENTYFOURHOURS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get Poll Last 7 Days
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public List<Poll> getPollFrontEndLast7Days(final Integer start, final Integer maxResults) {
        return this.getPollFrontEnd(SearchPeriods.SEVENDAYS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get Poll Last 30 Days
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Poll> getPollFrontEndLast30Days(final Integer start, final Integer maxResults) {
        return this.getPollFrontEnd(SearchPeriods.THIRTYDAYS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get Poll on All Time.
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Poll> getPollFrontEndAllTime(final Integer start, final Integer maxResults) {
        return this.getPollFrontEnd(SearchPeriods.ALLTIME, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll Last 24 Hours.
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Survey> getSurveyFrontEndLast24(final Integer start, final Integer maxResults) {
        return this.getSurveyFrontEnd(SearchPeriods.TWENTYFOURHOURS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll Last 7 Days
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Survey> getSurveyFrontEndLast7Days(final Integer start, final Integer maxResults) {
        return this.getSurveyFrontEnd(SearchPeriods.SEVENDAYS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll Last 30 Days
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Survey> getSurveyFrontEndLast30Days(final Integer start, final Integer maxResults) {
        return this.getSurveyFrontEnd(SearchPeriods.THIRTYDAYS, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /**
     * Get TweetPoll all time.
     * @param maxResults max results
     * @return list of tweetPoll.
     */
    public final List<Survey> getSurveyFrontEndAllTime(final Integer start, final Integer maxResults) {
        return this.getSurveyFrontEnd(SearchPeriods.ALLTIME, start, maxResults, this.WITHOUT_FIRST_RESULTS);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.encuestame.persistence.dao.IFrontEndDao#getAllHitsByType(org.
     * encuestame.persistence.domain.tweetpoll.TweetPoll,
     * org.encuestame.persistence.domain.survey.Poll,
     * org.encuestame.persistence.domain.survey.Survey)
     */
    @SuppressWarnings("unchecked")
    public List<Hit> getAllHitsByType(final TweetPoll tweetpoll, final Poll poll, final Survey survey) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Hit.class);
        if (poll != null) {
            criteria.createAlias("poll", "poll");
            criteria.add(Restrictions.eq("poll", poll));
        } else if (tweetpoll != null) {
            criteria.createAlias("tweetPoll", "tweetPoll");
            criteria.add(Restrictions.eq("tweetPoll", tweetpoll));
        } else if (survey != null) {
            criteria.createAlias("survey", "survey");
            criteria.add(Restrictions.eq("survey", survey));
        }
        return (List<Hit>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.encuestame.persistence.dao.IFrontEndDao#getHitsByIpAndType(java.lang.
     * String, java.lang.Long,
     * org.encuestame.persistence.domain.TypeSearchResult)
     */
    public List<Hit> getHitsByIpAndType(final String ipAddress, final Long id, final TypeSearchResult searchHitby) {
        log.debug("searching item hits by ipAddress ---> " + ipAddress);
        @SuppressWarnings({ "unchecked", "rawtypes" })
        List<Hit> searchResult = (List) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(org.hibernate.Session session) {
                List<Hit> searchResult = new ArrayList<Hit>();
                final Criteria criteria = session.createCriteria(Hit.class);
                if (searchHitby.equals(TypeSearchResult.TWEETPOLL)) {
                    criteria.createAlias("tweetPoll", "tweetPoll");
                    criteria.add(Restrictions.eq("tweetPoll.tweetPollId", id));
                } else if (searchHitby.equals(TypeSearchResult.POLL)) {
                    criteria.createAlias("poll", "poll");
                    criteria.add(Restrictions.eq("poll.pollId", id));
                } else if (searchHitby.equals(TypeSearchResult.SURVEY)) {
                    criteria.createAlias("survey", "survey");
                    criteria.add(Restrictions.eq("survey.sid", id));
                } else if (searchHitby.equals(TypeSearchResult.HASHTAG)) {
                    criteria.createAlias("hashTag", "hashTag");
                    criteria.add(Restrictions.eq("hashTag.hashTagId", id));
                } else {
                    log.error(" Search hit result type undefined " + searchHitby);
                }
                //define the type of hit.
                criteria.add(Restrictions.eq("hitCategory", HitCategory.VISIT));
                searchResult = (List<Hit>) fetchPhraseFullText(ipAddress, "ipAddress", Hit.class, criteria,
                        new SimpleAnalyzer());
                log.debug("total hits results ---> " + searchResult.size());
                return searchResult;
            }
        });
        return searchResult;
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IFrontEndDao#getTotalHitsbyType(java.lang.Long, java.lang.String)
     */
    public final Long getTotalHitsbyType(final Long id, final TypeSearchResult searchHitby, final Integer period) {
        Date startDate = null;
        Date endDate = null;
        if (period != null) {
            final DateTime dateTime = new DateTime();
            endDate = dateTime.toDate();
            startDate = DateUtil.minusDaysToCurrentDate(period, dateTime.toDate());
        }
        final DetachedCriteria criteria = DetachedCriteria.forClass(Hit.class);
        criteria.setProjection(Projections.rowCount());
        if (searchHitby.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.createAlias("tweetPoll", "tweetPoll");
            criteria.add(Restrictions.eq("tweetPoll.tweetPollId", id));
        } else if (searchHitby.equals(TypeSearchResult.POLL)) {
            criteria.createAlias("poll", "poll");
            criteria.add(Restrictions.eq("poll.pollId", id));
        } else if (searchHitby.equals(TypeSearchResult.SURVEY)) {
            criteria.createAlias("survey", "survey");
            criteria.add(Restrictions.eq("survey.sid", id));
        } else if (searchHitby.equals(TypeSearchResult.HASHTAG)) {
            criteria.createAlias("hashTag", "hashTag");
            criteria.add(Restrictions.eq("hashTag.hashTagId", id));
        } else {
            log.error(" Search hit result type undefined " + searchHitby);
        }

        if (startDate != null && endDate != null) {
            criteria.add(Restrictions.between("hitDate", startDate, endDate));
        }

        //define as a VISIT category
        criteria.add(Restrictions.eq("hitCategory", HitCategory.VISIT));
        @SuppressWarnings("unchecked")
        List<Hit> results = (List<Hit>) getHibernateTemplate().findByCriteria(criteria);
        log.debug("Retrieve total hits by  " + searchHitby + "--->" + results.size());
        return (Long) (results.get(0) == null ? 0 : results.get(0));
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.IFrontEndDao#getHashTagHitsbyDateRange
     * (java.lang.Long, java.lang.Integer, java.lang.Integer, java.lang.Integer,
     * java.lang.Integer)
     */
    @SuppressWarnings("unchecked")
    public List<Hit> getHashTagHitsbyDateRange(final Long tagId, final Integer period) {
        Date startDate = null;
        Date endDate = null;
        if (period != null) {
            final Calendar hi = Calendar.getInstance();
            hi.add(Calendar.DAY_OF_YEAR, -period);
            startDate = hi.getTime();
            endDate = Calendar.getInstance().getTime();

        }

        final DetachedCriteria criteria = DetachedCriteria.forClass(Hit.class);
        criteria.createAlias("hashTag", "hashTag");
        criteria.add(Restrictions.eq("hashTag.hashTagId", tagId));
        criteria.addOrder(Order.desc("hitDate"));
        criteria.add(Restrictions.between("hitDate", startDate, endDate));
        //define as a VISIT category
        criteria.add(Restrictions.eq("hitCategory", HitCategory.VISIT));
        return (List<Hit>) getHibernateTemplate().findByCriteria(criteria);

    }

    /**
     *
     * @param type
     * @param question
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<Hit> getVotesByType(final TypeSearchResult type, final UserAccount userAccount,
            final Question question) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(Hit.class);
        criteria.add(Restrictions.eq("typeSearchResult", type));
        criteria.add(Restrictions.eq("question", question));
        criteria.add(Restrictions.eq("userAccount", userAccount));
        criteria.add(Restrictions.eq("hitCategory", HitCategory.VOTE));
        return (List<Hit>) getHibernateTemplate().findByCriteria(criteria);
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.encuestame.persistence.dao.IFrontEndDao#getHashTagHitsRange(java.
     * lang.Long, org.encuestame.utils.enums.SearchPeriods)
     */
    @SuppressWarnings("unchecked")
    public List<Hit> getHashTagHitsRange(final Long tagId, final SearchPeriods period) {

        final DetachedCriteria criteria = DetachedCriteria.forClass(Hit.class);
        criteria.createAlias("hashTag", "hashTag");
        criteria.add(Restrictions.eq("hashTag.hashTagId", tagId));
        criteria.addOrder(Order.desc("hitDate"));

        // define as a VISIT category
        criteria.add(Restrictions.eq("hitCategory", HitCategory.VISIT));

        ProjectionList projList = Projections.projectionList();
        projList.add(Projections.groupProperty("hitDate"));

        projList.add(Projections.rowCount());
        criteria.setProjection(projList);
        return (List<Hit>) getHibernateTemplate().findByCriteria(criteria);

    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IFrontEndDao#getAccessRatebyItem(java.lang.String, java.lang.Long, java.lang.String)
     */
    public List<AccessRate> getAccessRatebyItem(final String ipAddress, final Long itemId,
            final TypeSearchResult searchbyType) {
        @SuppressWarnings({ "unchecked", "rawtypes" })
        List<AccessRate> searchResult = (List) getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(org.hibernate.Session session) {
                List<AccessRate> searchResult = new ArrayList<AccessRate>();
                final Criteria criteria = session.createCriteria(AccessRate.class);
                if (searchbyType.equals(TypeSearchResult.TWEETPOLL)) {
                    criteria.createAlias("tweetPoll", "tweetPoll");
                    criteria.add(Restrictions.eq("tweetPoll.tweetPollId", itemId));
                } else if (searchbyType.equals(TypeSearchResult.SURVEY)) {
                    criteria.createAlias("survey", "survey");
                    criteria.add(Restrictions.eq("survey.sid", itemId));
                } else if (searchbyType.equals(TypeSearchResult.POLL)) {
                    criteria.createAlias("poll", "poll");
                    criteria.add(Restrictions.eq("poll.pollId", itemId));
                } else {
                    log.error(" Search access rate result type undefined " + searchbyType);
                }
                searchResult = (List<AccessRate>) fetchPhraseFullText(ipAddress, "ipAddress", AccessRate.class,
                        criteria, new SimpleAnalyzer());
                return searchResult;
            }
        });
        return searchResult;
    }

    /*
     * (non-Javadoc)
     * @see org.encuestame.persistence.dao.IFrontEndDao#getLinksByHomeItem(org.encuestame.persistence.domain.HashTag, org.encuestame.persistence.domain.security.UserAccount, org.encuestame.persistence.domain.tweetpoll.TweetPoll, org.encuestame.persistence.domain.survey.Survey, org.encuestame.persistence.domain.survey.Poll, org.encuestame.utils.enums.TypeSearchResult)
     */
    //TODO: Remove @Autowired Domain Refereces.
    @SuppressWarnings("unchecked")
    public List<TweetPollSavedPublishedStatus> getLinksByHomeItem(final HashTag hashTag,
            final UserAccount userAccount, final TweetPoll tweetPoll, final Survey survey, final Poll poll,
            final TypeSearchResult itemType, final SearchPeriods searchPeriods, final Integer start,
            final Integer max, final List<TweetPoll> tpollsByHashTag, final List<Poll> pollsByHashtag) {
        final DetachedCriteria criteria = DetachedCriteria.forClass(TweetPollSavedPublishedStatus.class);
        // define if is necessary execute a query, if not exist filters it's not necessary run a query
        boolean queryRequired = false;
        List<TweetPollSavedPublishedStatus> tweetPollSavedPublishedStatus = ListUtils.EMPTY_LIST;
        if (itemType.equals(TypeSearchResult.TWEETPOLL)) {
            criteria.add(Restrictions.eq("tweetPoll", tweetPoll));
            queryRequired = true;
        } else if (itemType.equals(TypeSearchResult.SURVEY)) {
            criteria.add(Restrictions.eq("survey", survey));
            queryRequired = true;
        } else if (itemType.equals(TypeSearchResult.POLL)) {
            criteria.add(Restrictions.eq("poll", poll));
            queryRequired = true;
        } else if (itemType.equals(TypeSearchResult.HASHTAG)) {
            // FUTURE: We need include Surveys by Hashtag
            // include on the query all published items by tweetpoll
            if (tpollsByHashTag.size() != 0) {
                criteria.add(Restrictions.in("tweetPoll", tpollsByHashTag));
                queryRequired = true;
            }
            // include on the query all published items by poll
            if (pollsByHashtag.size() != 0) {
                criteria.add(Restrictions.in("poll", pollsByHashtag));
                queryRequired = true;
            }
            //BUG: We have a serial problem here, if poll and tweetpoll are null the criteria retrieve ALL items. ENCUESTAME-490
        } else if (itemType.equals(TypeSearchResult.PROFILE)) {
            //TODO: future
            //return ListUtils.EMPTY_LIST;
            //queryRequired = true;
        } else {
            log.error("Item type not valid: " + itemType);
        }
        criteria.addOrder(Order.desc("publicationDateTweet"));
        //FIXME: why this line are commented?
        //criteria.add(Restrictions.isNotNull("apiType"));
        //criteria.add(Restrictions.isNotNull("tweetId"));
        criteria.add(Restrictions.eq("status", Status.SUCCESS));
        // if exist filters, we execute a query
        if (queryRequired) {
            tweetPollSavedPublishedStatus = (List<TweetPollSavedPublishedStatus>) getHibernateTemplate()
                    .findByCriteria(criteria, start, max);
        }
        return tweetPollSavedPublishedStatus;
    }
}