Java tutorial
/* ************************************************************************************ * Copyright (C) 2001-2012 encuestame: system online surveys Copyright (C) 2012 * 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.business.service; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.encuestame.core.service.IStatisticsService; import org.encuestame.core.util.ConvertDomainBean; import org.encuestame.persistence.domain.HashTag; import org.encuestame.persistence.domain.Hit; 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.TweetPollResult; import org.encuestame.persistence.domain.tweetpoll.TweetPollSavedPublishedStatus; import org.encuestame.persistence.domain.tweetpoll.TweetPollSwitch; import org.encuestame.util.exception.EnMeNoResultsFoundException; import org.encuestame.util.exception.EnMeSearchException; import org.encuestame.utils.DateUtil; import org.encuestame.utils.enums.HashTagRate; import org.encuestame.utils.enums.SearchPeriods; import org.encuestame.utils.enums.TypeSearchResult; import org.encuestame.utils.web.stats.HashTagDetailStats; import org.encuestame.utils.web.stats.HashTagListGraphData; import org.encuestame.utils.web.stats.ItemStatDetail; import org.joda.time.DateTime; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Statistics Service. * @author Morales, Diana Paola paolaATencuestame.org * @since April 25, 2012 */ @Service @Transactional public class StatisticsService extends AbstractBaseService implements IStatisticsService { /** Statistics Service Log. **/ private Log log = LogFactory.getLog(this.getClass()); /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalSocialLinksbyHashTagUsageAndDateRange(java.lang.String, * java.lang.Integer, javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalSocialLinksbyHashTagUsageAndDateRange(final String tagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeSearchException { List<HashTagDetailStats> tagDetailStatsBySocial = new ArrayList<HashTagDetailStats>(); List<ItemStatDetail> tpSocialSavePublishedDetail = new ArrayList<ItemStatDetail>(); List<TweetPollSavedPublishedStatus> tpSavedPublished = new ArrayList<TweetPollSavedPublishedStatus>(); if (period == null) { throw new EnMeSearchException("search params required."); } else { final List<TweetPoll> tpolls = getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); for (TweetPoll tweetPoll : tpolls) { tpSavedPublished = getTweetPollDao().getSocialLinksByTypeAndDateRange(tweetPoll, null, null, TypeSearchResult.TWEETPOLL); tpSocialSavePublishedDetail.addAll(ConvertDomainBean .convertTweetPollSavedPublishedStatusListToItemDetailBean(tpSavedPublished)); } this.removeDuplicatleItemOutOfRange(tpSocialSavePublishedDetail, period.toDays()); tagDetailStatsBySocial = this.compareList(tpSocialSavePublishedDetail, period, request); return tagDetailStatsBySocial; } } /* * (non-Javadoc) * @see org.encuestame.core.service.imp.IStatisticsService#getTotalSocialLinksbyHashTagUsageAndDateRangeGraph(java.lang.String, org.encuestame.utils.enums.SearchPeriods, javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalSocialLinksbyHashTagUsageAndDateRangeGraph(final String tagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeSearchException { List<HashTagDetailStats> tagDetailStatsBySocial = new ArrayList<HashTagDetailStats>(); List<ItemStatDetail> tpSocialSavePublishedDetail = new ArrayList<ItemStatDetail>(); List<TweetPollSavedPublishedStatus> tpSavedPublished = new ArrayList<TweetPollSavedPublishedStatus>(); if (period == null) { throw new EnMeSearchException("search params required."); } else { // Retrieve all tweetpolls by period final List<TweetPoll> tpolls = getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); for (TweetPoll tweetPoll : tpolls) { tpSavedPublished = getTweetPollDao().getSocialLinksByTypeAndDateRange(tweetPoll, null, null, TypeSearchResult.TWEETPOLL); tpSocialSavePublishedDetail.addAll(ConvertDomainBean .convertTweetPollSavedPublishedStatusListToItemDetailBean(tpSavedPublished)); } this.removeDuplicatleItemOutOfRange(tpSocialSavePublishedDetail, period.toDays()); tagDetailStatsBySocial = this.compareHashtagListGraph(tpSocialSavePublishedDetail, period, request); return tagDetailStatsBySocial; } } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalVotesbyHashTagUsageAndDateRange(java.lang.String, * java.lang.Integer, javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalVotesbyHashTagUsageAndDateRange(final String tagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeSearchException { List<ItemStatDetail> tpResultsBean = new ArrayList<ItemStatDetail>(); List<TweetPollResult> tpollResults = new ArrayList<TweetPollResult>(); List<TweetPollSwitch> tpollsSwitch = new ArrayList<TweetPollSwitch>(); List<HashTagDetailStats> tagDetailStatsByVotes = new ArrayList<HashTagDetailStats>(); if (period == null) { throw new EnMeSearchException("search params required."); } else { final List<TweetPoll> tpolls = getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); log.debug("Total Tweetpolls by hashtagName" + tpolls.size()); for (TweetPoll tweetPoll : tpolls) { tpollsSwitch = getTweetPollDao().getListAnswersByTweetPollAndDateRange(tweetPoll); log.trace("Total TweetpollSwitch by tweetPoll -->" + tpollsSwitch.size()); for (TweetPollSwitch tweetPollSwitch : tpollsSwitch) { tpollResults = getTweetPollDao().getTweetPollResultsByTweetPollSwitch(tweetPollSwitch); log.trace("Total TweetPollResults by tweetPollSwitch -->" + tpollResults.size()); tpResultsBean .addAll(ConvertDomainBean.convertTweetPollResultListToItemDetailBean(tpollResults)); } } } this.removeDuplicatleItemOutOfRange(tpResultsBean, period.toDays()); tagDetailStatsByVotes = this.compareList(tpResultsBean, period, request); return tagDetailStatsByVotes; } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalVotesbyHashTagUsageAndDateRangeGraph(java.lang.String, * org.encuestame.utils.enums.SearchPeriods, * javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalVotesbyHashTagUsageAndDateRangeGraph(final String tagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeSearchException { List<ItemStatDetail> tpResultsBean = new ArrayList<ItemStatDetail>(); List<TweetPollResult> tpollResults = new ArrayList<TweetPollResult>(); List<TweetPollSwitch> tpollsSwitch = new ArrayList<TweetPollSwitch>(); List<HashTagDetailStats> tagDetailStatsByVotes = new ArrayList<HashTagDetailStats>(); if (period == null) { throw new EnMeSearchException("search params required."); } else { final List<TweetPoll> tpolls = getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); log.debug("Total Tweetpolls by hashtagName" + tpolls.size()); for (TweetPoll tweetPoll : tpolls) { tpollsSwitch = getTweetPollDao().getListAnswersByTweetPollAndDateRange(tweetPoll); log.trace("Total TweetpollSwitch by tweetPoll -->" + tpollsSwitch.size()); for (TweetPollSwitch tweetPollSwitch : tpollsSwitch) { tpollResults = getTweetPollDao().getTweetPollResultsByTweetPollSwitch(tweetPollSwitch); log.trace("Total TweetPollResults by tweetPollSwitch -->" + tpollResults.size()); tpResultsBean .addAll(ConvertDomainBean.convertTweetPollResultListToItemDetailBean(tpollResults)); } } } this.removeDuplicatleItemOutOfRange(tpResultsBean, period.toDays()); tagDetailStatsByVotes = this.compareHashtagListGraph(tpResultsBean, period, request); return tagDetailStatsByVotes; } /** * Remove duplicate item from {@link TweetPollResult} vote. * @param itemList * @param period */ private void removeDuplicatleItemOutOfRange(final List<ItemStatDetail> itemList, final Integer period) { Boolean check; for (int i = 0; i < itemList.size(); i++) { check = DateUtil.checkDatedWithinAllowableRange(period, itemList.get(i).getDate()); if (!check) { itemList.remove(i); } } } /** * * @param itemList * @param period * @param request * @return * @throws EnMeSearchException */ private List<HashTagDetailStats> compareList(final List<ItemStatDetail> itemList, final SearchPeriods period, final HttpServletRequest request) throws EnMeSearchException { Integer month = 0; Integer monthB; String rangeSubLabel = null; boolean existItemStatDetailLabel = false; List<HashTagDetailStats> tagDetailStatsCompare = new ArrayList<HashTagDetailStats>(); //FIXME: It's limited only for dates in the same year, upgrade to accept dates for different year. for (int i = 0; i < itemList.size(); i++) { Long countItems = 0L; monthB = this.getLabelDateValue(period, itemList.get(i).getDate()); for (int j = 0; j < itemList.size(); j++) { month = this.getLabelDateValue(period, itemList.get(j).getDate()); if (monthB == month) { countItems++; } } //check if the label exist previously existItemStatDetailLabel = checkLabelExistsHashTagDetailStat(tagDetailStatsCompare, monthB.toString()); if (!existItemStatDetailLabel) { rangeSubLabel = this.getHashTagStatsDataRangeLabel(period.toString(), monthB, request); tagDetailStatsCompare.add(this.createTagDetailsStats(monthB.toString(), countItems, rangeSubLabel)); } } return tagDetailStatsCompare; } /** * Check if the label exist previously. * @param detail List of hashtag details. * @param label * @return */ private boolean checkLabelExistsHashTagDetailStat(final List<HashTagDetailStats> detail, final String label) { boolean existLabel = false; if (detail.size() > 0) { for (HashTagDetailStats hashTagDetailStats : detail) { if (hashTagDetailStats.getLabel().equals(label)) { existLabel = true; } } } return existLabel; } /** * Convert a number to correct i18n label. * eg: 12 == December / ONEYEAR * 6 == Saturday / SEVENDAYS * 24 == 24 / TWENTYFOURHOURS * @param period the period * @param label the label to be translated * @param request {@link HttpServletRequest}. * @return */ private String getHashTagStatsDataRangeLabel(final String period, final Integer label, final HttpServletRequest request) { String dataRangeLabel = null; HashTagRate tagRateLabel; final SearchPeriods periodSelected = SearchPeriods.getPeriodString(period); if (periodSelected.equals(SearchPeriods.ONEYEAR)) { tagRateLabel = HashTagRate.getHashTagMonthLabel(Integer.toString(label)); dataRangeLabel = this.convertHashTagDataRangeLabelMessage(tagRateLabel, request, new Object[] {}); } else if (periodSelected.equals(SearchPeriods.ALLTIME)) { dataRangeLabel = String.valueOf(label); } else if (periodSelected.equals(SearchPeriods.THIRTYDAYS)) { dataRangeLabel = String.valueOf(label); } else if (periodSelected.equals(SearchPeriods.TWENTYFOURHOURS)) { dataRangeLabel = String.valueOf(label); } else if (periodSelected.equals(SearchPeriods.SEVENDAYS)) { tagRateLabel = HashTagRate.getHashTagWeekDayLabel(Integer.toString(label)); dataRangeLabel = this.convertHashTagDataRangeLabelMessage(tagRateLabel, request, new Object[] {}); } return dataRangeLabel; } /** * Return the label value of the period based on {@link Date}. * eg :: 22/12/2012 - Period : ONEYEAR * return 12; * @param period {@link SearchPeriods} * @param pubDate {@link Date} * @return */ private Integer getLabelDateValue(final SearchPeriods periodSelected, final Date pubDate) { Integer labelValue = null; if (periodSelected.equals(SearchPeriods.ONEYEAR)) { //return motnhs labelValue = DateUtil.getValueCurrentMonthOfTheYear(pubDate); } else if (periodSelected.equals(SearchPeriods.THIRTYDAYS)) { //return days labelValue = DateUtil.getValueCurrentDateOfTheMonths(pubDate); } else if (periodSelected.equals(SearchPeriods.TWENTYFOURHOURS)) { //return hours labelValue = DateUtil.getValueHourOfTheDay(pubDate); } else if (periodSelected.equals(SearchPeriods.SEVENDAYS)) { //return days labelValue = DateUtil.getValueCurrentDayOfTheWeek(pubDate); } else if (periodSelected.equals(SearchPeriods.ALLTIME)) { //return years labelValue = DateUtil.getValueCurrentYear(pubDate); } return labelValue; } /** * Get total tweetpoll usage stats by hastag and date range. * * @param tagName * @param period * @return */ private List<TweetPoll> getTotalTweetPollUsageByHashTagAndDateRange(final String tagName, final SearchPeriods period) { List<TweetPoll> tweetPollsByHashTag = new ArrayList<TweetPoll>(); // Gets the tweetpolls by hashtag tweetPollsByHashTag = getTweetPollDao().getTweetPollsbyHashTagNameAndDateRange(tagName, period); // Gets the stats detail of hashtags by tweetpoll. return tweetPollsByHashTag; } /** * * @param tagName * @param period * @return */ private List<Object[]> getTweetPollsRangeStats(final String tagName, final SearchPeriods period) { List<Object[]> tweetPollsByHashTag = getTweetPollDao().getTweetPollsRangeStats(tagName, period); return tweetPollsByHashTag; } /** * * @param tagName * @param period * @return */ private List<Object[]> getPollsRangeStats(final String tagName, final SearchPeriods period) { List<Object[]> pollsByHashTag = new ArrayList<Object[]>(); pollsByHashTag = getPollDao().getPollsRangeStats(tagName, period); return pollsByHashTag; } /** * * @param tagName * @param period * @return */ private List<Object[]> getSurveysRangeStats(final String tagName, final SearchPeriods period) { List<Object[]> surveysByHashTag = new ArrayList<Object[]>(); surveysByHashTag = getSurveyDaoImp().getSurveysRangeStats(tagName, period); return surveysByHashTag; } /** * Get total poll usage stats by hastag and date range. * * @param tagName * @param period * @return */ private List<Poll> getTotalPollUsageByHashTagAndDateRange(final String tagName, final SearchPeriods period) { List<Poll> pollsByHashTag = new ArrayList<Poll>(); pollsByHashTag = getPollDao().getPollsbyHashTagNameAndDateRange(tagName, period); return pollsByHashTag; } /** * Get total survey usage by HashTag name and date range. * @param tagName * @param period * @return */ private List<Survey> getTotalSurveyUsageByHashTagAndDateRange(final String tagName, final SearchPeriods period) { List<Survey> surveysByHashTag = new ArrayList<Survey>(); surveysByHashTag = getSurveyDaoImp().getSurveysbyHashTagNameAndDateRange(tagName, period); return surveysByHashTag; } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalUsagebyHashTagAndDateRange(java.lang.String, java.lang.Integer, * javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalUsagebyHashTagAndDateRange(final String hashTagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { // Check if the hashtag exists final HashTag tag = this.getHashTag(hashTagName, true); List tweetPollsByDateRange = new ArrayList(); List<Poll> pollsByDateRange = new ArrayList<Poll>(); List<Survey> surveysByDateRange = new ArrayList<Survey>(); List<ItemStatDetail> itemStatDetailByUsage = new ArrayList<ItemStatDetail>(); // If the tag exists then obtains the total List<HashTagDetailStats> tagDetailStatsByTagName = new ArrayList<HashTagDetailStats>(); tweetPollsByDateRange = this.getTotalTweetPollUsageByHashTagAndDateRange(tag.getHashTag(), period); pollsByDateRange = this.getTotalPollUsageByHashTagAndDateRange(tag.getHashTag(), period); surveysByDateRange = this.getTotalSurveyUsageByHashTagAndDateRange(tag.getHashTag(), period); itemStatDetailByUsage .addAll(ConvertDomainBean.convertObjectTweetPollListToItemDetailBean(tweetPollsByDateRange)); itemStatDetailByUsage.addAll(ConvertDomainBean.convertPollListToItemDetailBean(pollsByDateRange)); itemStatDetailByUsage.addAll(ConvertDomainBean.convertSurveyListToItemDetailBean(surveysByDateRange)); tagDetailStatsByTagName = this.compareList(itemStatDetailByUsage, period, request); return tagDetailStatsByTagName; } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalHitsUsagebyHashTagAndDateRange(java.lang.String, * java.lang.Integer, javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalHitsUsagebyHashTagAndDateRange(final String hashTagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { List<Hit> hashTagHits = new ArrayList<Hit>(); List<HashTagDetailStats> tagDetailStatsByHits = new ArrayList<HashTagDetailStats>(); final HashTag tag = this.getHashTag(hashTagName, Boolean.TRUE); List<ItemStatDetail> itemStatDetailByHits = new ArrayList<ItemStatDetail>(); if (tag != null) { hashTagHits = getFrontEndDao().getHashTagHitsbyDateRange(tag.getHashTagId(), period.toDays()); } itemStatDetailByHits.addAll(ConvertDomainBean.convertHitListToItemDetailBean(hashTagHits)); tagDetailStatsByHits = this.compareList(itemStatDetailByHits, period, request); return tagDetailStatsByHits; } /* * (non-Javadoc) * * @see * org.encuestame.core.service.imp.IStatisticsService#getTotalUsageByHashTag * (java.lang.String, java.lang.Integer, java.lang.Integer, * org.encuestame.utils.enums.TypeSearchResult, * javax.servlet.http.HttpServletRequest) */ public HashTagDetailStats getTotalUsageByHashTag(final String tagName, final Integer initResults, final Integer maxResults, final TypeSearchResult filter, final HttpServletRequest request, final SearchPeriods periods) throws EnMeNoResultsFoundException { // Validate if tag belongs to hashtag and filter isn't empty. Long totalUsagebyHashTag = 0L; final HashTag tag = getHashTag(tagName, true); if (tag != null) { final List<TweetPoll> tweetsbyTag = this.getTweetPollsByHashTag(tagName, initResults, maxResults, filter, periods); final int totatTweetPolls = tweetsbyTag.size(); final List<Poll> pollsbyTag = this.getPollsByHashTag(tagName, initResults, maxResults, filter, periods); final int totalPolls = pollsbyTag.size(); final List<Survey> surveysbyTag = this.getSurveysByHashTag(tagName, initResults, maxResults, filter, periods); final int totalSurveys = surveysbyTag.size(); totalUsagebyHashTag = (long) (totatTweetPolls + totalPolls + totalSurveys); } final HashTagDetailStats detailStatItem = this.createHashTagDetailButtonStats(HashTagRate.LBL_USAGE, totalUsagebyHashTag, HashTagRate.SUB_LBL_TIMES, request); return detailStatItem; } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getSocialNetworkUseByHashTag(java.lang.String, java.lang.Integer, * java.lang.Integer, javax.servlet.http.HttpServletRequest) */ public HashTagDetailStats getSocialNetworkUseByHashTag(final String tagName, final Integer initResults, final Integer maxResults, final HttpServletRequest request, final SearchPeriods searchPeriods) { // 1- Get tweetPoll, Polls o Survey Long linksbyTweetPoll = 0L; Long linksbyPoll = 0L; Long totalSocialLinks = 0L; linksbyTweetPoll = this.getTweetPollSocialNetworkLinksbyTag(tagName, initResults, maxResults, TypeSearchResult.TWEETPOLL, searchPeriods); linksbyPoll = this.getPollsSocialNetworkLinksByTag(tagName, initResults, maxResults, TypeSearchResult.POLL, searchPeriods); totalSocialLinks = linksbyTweetPoll + linksbyPoll; //TODO: add Survey support final HashTagDetailStats detailStatItem = this.createHashTagDetailButtonStats( HashTagRate.LBL_SOCIAL_NETWORK, totalSocialLinks, HashTagRate.SUB_LBL_TWEETS, request); return detailStatItem; } /* * (non-Javadoc) * * @see * org.encuestame.core.service.imp.IStatisticsService#getHashTagHitsbyName * (java.lang.String, org.encuestame.utils.enums.TypeSearchResult, * javax.servlet.http.HttpServletRequest) */ public HashTagDetailStats getHashTagHitsbyName(final String tagName, final TypeSearchResult filterBy, final HttpServletRequest request, final SearchPeriods periods) throws EnMeNoResultsFoundException { final HashTag tag = getHashTag(tagName, true); final Long hits = this.getTotalHits(tag.getHashTagId(), TypeSearchResult.HASHTAG, periods); final HashTagDetailStats detailStatItem = this.createHashTagDetailButtonStats(HashTagRate.LBL_HITS, hits, HashTagRate.SUB_LBL_TIMES, request); return detailStatItem; } /* * (non-Javadoc) * * @see * org.encuestame.core.service.imp.IStatisticsService#getHashTagUsedOnItemsVoted * (java.lang.String, java.lang.Integer, java.lang.Integer, * javax.servlet.http.HttpServletRequest) */ public HashTagDetailStats getHashTagUsedOnItemsVoted(final String tagName, final Integer initResults, final Integer maxResults, final HttpServletRequest request, final SearchPeriods periods) { Long totalVotesbyTweetPoll = 0L; Long totalVotesbyPoll = 0L; Long totalHashTagUsedOnItemsVoted = 0L; totalVotesbyTweetPoll = this.retrieveTweetPollTotalVotesByHashTag(tagName, periods); log.debug("Total tweetPoll votes by hashtag name : " + totalVotesbyTweetPoll); totalVotesbyPoll = this.retrievePollTotalVotesByHashTag(tagName, periods); log.debug("Total poll votes by hashtag name : " + totalVotesbyPoll); totalHashTagUsedOnItemsVoted = totalVotesbyTweetPoll + totalVotesbyPoll; log.debug("Total HashTag used votes : " + totalHashTagUsedOnItemsVoted); final HashTagDetailStats detailStatItem = this.createHashTagDetailButtonStats(HashTagRate.LBL_VOTES, totalHashTagUsedOnItemsVoted, HashTagRate.SUB_LBL_VOTES, request); return detailStatItem; } /** * * @param tagName * @param period * @return */ private Long retrievePollTotalVotesByHashTag(final String tagName, final SearchPeriods period) { Long totalPollVotes = 0L; final List<Poll> polls = this.getPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); for (Poll poll : polls) { //TODO : Change method retrieve Poll Result by a counter polls final int votesByPoll = getPollDao().retrievePollResults(poll).size(); totalPollVotes = totalPollVotes + votesByPoll; } return totalPollVotes; } /** * Return total votes by tweetpoll filtered by hashtag. * @param tagName * @param period * @return */ private Long retrieveTweetPollTotalVotesByHashTag(final String tagName, final SearchPeriods period) { Long totalTweetPollVotes = 0L; // 1- Retrieve a tweetpoll list filtered by hashtag and specific period final List<TweetPoll> tweetPolls = this.getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); log.debug("TweetPolls by HashTag ****************************************** " + tweetPolls.size() + "Period ***********************" + period.toString()); // 2- Iterate tweetpoll list and sum of votes for each tweetpoll for (TweetPoll tweetPoll : tweetPolls) { final Long votesByTweetPoll = getTweetPollDao().getTotalVotesByTweetPollId(tweetPoll.getTweetPollId()); totalTweetPollVotes = totalTweetPollVotes + votesByTweetPoll.intValue(); } log.debug("Total Votes by Tweetpoll ******************************************" + totalTweetPollVotes); return totalTweetPollVotes; } /** * Get Polls by HashTag * * @param tagName * @param initResults * @param maxResults * @param filter * @return */ private List<Poll> getPollsByHashTag(final String tagName, final Integer initResults, final Integer maxResults, final TypeSearchResult filter, final SearchPeriods searchPeriods) { final List<Poll> pollsByTag = getPollDao().getPollByHashTagName(tagName, initResults, maxResults, filter, searchPeriods); return pollsByTag; } /** * Get polls social network links by tag. * * @param tagName * @param initResults * @param maxResults * @param filter * @return */ private Long getPollsSocialNetworkLinksByTag(final String tagName, final Integer initResults, final Integer maxResults, final TypeSearchResult filter, final SearchPeriods searchPeriods) { Long linksbyItem = 0L; Long totalLinksByPoll = 0L; final List<Poll> polls = this.getPollsByHashTag(tagName, initResults, maxResults, filter, searchPeriods); for (Poll poll : polls) { linksbyItem = getTweetPollDao().getSocialLinksByType(null, null, poll, TypeSearchResult.POLL); totalLinksByPoll = totalLinksByPoll + linksbyItem; } return totalLinksByPoll; } /** * Get tweetPolls social network links by tag. * @param tagName * @param initResults * @param maxResults * @param filter * @return */ private Long getTweetPollSocialNetworkLinksbyTag(final String tagName, final Integer initResults, final Integer maxResults, final TypeSearchResult filter, final SearchPeriods searchPeriods) { Long linksbyItem = 0L; Long totalLinksByTweetPoll = 0L; final List<TweetPoll> tp = this.getTweetPollsByHashTag(tagName, initResults, maxResults, filter, searchPeriods); for (TweetPoll tweetPoll : tp) { // Get total value by links linksbyItem = getTweetPollDao().getSocialLinksByType(tweetPoll, null, null, TypeSearchResult.TWEETPOLL); totalLinksByTweetPoll = totalLinksByTweetPoll + linksbyItem; } return totalLinksByTweetPoll; } /** * Create {@link HashTagDetailStats} for {@link HashTag} stats button. * @param label * @param value * @param subLabel * @param request * @return */ private HashTagDetailStats createHashTagDetailButtonStats(final HashTagRate label, final Long value, final HashTagRate subLabel, final HttpServletRequest request) { final HashTagDetailStats tagDetails = new HashTagDetailStats(); tagDetails.setLabel(this.convertHashTagButtonStatsLabel(label, request, new Object[] {})); tagDetails.setValue(value); tagDetails.setSubLabel(this.convertHashTagButtonStatsLabel(subLabel, request, new Object[] {})); return tagDetails; } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalUsagebyHashtagAndDateRangeGraph(java.lang.String, * org.encuestame.utils.enums.SearchPeriods, * javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalUsagebyHashtagAndDateRangeGraph(final String hashTagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { // Check if the hashtag exists /* labels : ["January","February","March","April","May","June","July"], datasets : [ { fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", pointColor : "rgba(220,220,220,1)", pointStrokeColor : "#fff", data : [65,59,90,81,56,55,40] } ] */ final HashTag tag = this.getHashTag(hashTagName, true); List<Object[]> tweetPollsByDateRange = new ArrayList<Object[]>(); List<Object[]> pollsByDateRange = new ArrayList<Object[]>(); List<Object[]> surveysByDateRange = new ArrayList<Object[]>(); List<ItemStatDetail> itemStatDetailByUsage = new ArrayList<ItemStatDetail>(); // If the tag exists then obtains the total List<HashTagDetailStats> tagDetailStatsByTagName = new ArrayList<HashTagDetailStats>(); tweetPollsByDateRange = this.getTweetPollsRangeStats(tag.getHashTag(), period); pollsByDateRange = this.getPollsRangeStats(tag.getHashTag(), period); surveysByDateRange = this.getSurveysRangeStats(tag.getHashTag(), period); itemStatDetailByUsage.addAll(ConvertDomainBean.convertObjectListToItemDetailBean(tweetPollsByDateRange)); itemStatDetailByUsage.addAll(ConvertDomainBean.convertObjectListToItemDetailBean(pollsByDateRange)); itemStatDetailByUsage.addAll(ConvertDomainBean.convertObjectListToItemDetailBean(surveysByDateRange)); tagDetailStatsByTagName = this.compareHashtagListGraph(itemStatDetailByUsage, period, request); return tagDetailStatsByTagName; } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalHitsUsagebyHashTagAndDateRangeGraph(java.lang.String, * org.encuestame.utils.enums.SearchPeriods, * javax.servlet.http.HttpServletRequest) */ public List<HashTagDetailStats> getTotalHitsUsagebyHashTagAndDateRangeGraph(final String hashTagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { //TODO: This method should be updated //TODO: This method should be updated //TODO: This method should be updated List<Hit> hashTagHits = new ArrayList<Hit>(); List<HashTagDetailStats> tagDetailStatsByHits = new ArrayList<HashTagDetailStats>(); final HashTag tag = this.getHashTag(hashTagName, Boolean.TRUE); List<ItemStatDetail> itemStatDetailByHits = new ArrayList<ItemStatDetail>(); if (tag != null) { hashTagHits = getFrontEndDao().getHashTagHitsbyDateRange(tag.getHashTagId(), period.toDays()); } itemStatDetailByHits.addAll(ConvertDomainBean.convertHitListToItemDetailBean(hashTagHits)); tagDetailStatsByHits = this.compareList(itemStatDetailByHits, period, request); return tagDetailStatsByHits; } /** * * @param itemList * @param period * @param request * @return * @throws EnMeSearchException */ public List<HashTagDetailStats> compareHashtagListGraph(final List<ItemStatDetail> itemList, final SearchPeriods period, final HttpServletRequest request) throws EnMeSearchException { Integer month = 0; Integer monthB; Integer dayA = 0; Integer dayB = 0; Integer yearA = 0; Integer yearB = 0; boolean existItemStatDetailLabel = false; List<HashTagDetailStats> tagDetailStatsCompare = new ArrayList<HashTagDetailStats>(); //FIXME: It's limited only for dates in the same year, upgrade to accept dates for different year. for (int i = 0; i < itemList.size(); i++) { Long countItems = 0L; // Get the date values. monthB = DateUtil.getValueCurrentMonthOfTheYear(itemList.get(i).getDate()); dayB = DateUtil.getValueCurrentDateOfTheMonths(itemList.get(i).getDate()); yearB = DateUtil.getValueCurrentYear(itemList.get(i).getDate()); for (int j = 0; j < itemList.size(); j++) { month = DateUtil.getValueCurrentMonthOfTheYear(itemList.get(j).getDate()); dayA = DateUtil.getValueCurrentDateOfTheMonths(itemList.get(j).getDate()); yearA = DateUtil.getValueCurrentYear(itemList.get(j).getDate()); if ((monthB.equals(month)) && (dayB.equals(dayA)) && (yearB.equals(yearA))) { countItems++; } } //check if the label exist previously final DateTime myDate = new DateTime(itemList.get(i).getDate()); existItemStatDetailLabel = checkLabelExistsHashTagDetailStatGraph(tagDetailStatsCompare, myDate); if (!existItemStatDetailLabel) { tagDetailStatsCompare.add(this.createHastagItemDetailGraph(monthB.toString(), countItems, "Compare", myDate.getMillis(), myDate)); } } return tagDetailStatsCompare; } /** * * @param detail * @param dayLabel * @return */ private boolean checkLabelExistsHashTagDetailStatGraph(final List<HashTagDetailStats> detail, final DateTime dayLabel) { boolean existLabel = false; if (detail.size() > 0) { for (HashTagDetailStats hashTagDetailStats : detail) { final int detailStat = hashTagDetailStats.getDateValue().toLocalDate() .compareTo(dayLabel.toLocalDate()); // Values: 0 = Exist 1 = No exists if (detailStat == 0) { existLabel = true; } } } return existLabel; } /** * * @param year * @param value * @param month * @return */ private HashTagListGraphData createHastagItemDetailGraph(final Integer year, final Long value, final Integer month, final Integer day) { final HashTagListGraphData tagDetails = new HashTagListGraphData(); tagDetails.setMonth(month); tagDetails.setValue(value); tagDetails.setDay(day); tagDetails.setYear(year); return tagDetails; } /** Methods V2 Stats --->>>>> */ /** * Group a list of {@link HashTagListGraphData} * @param graphDatas * @return */ private final List<HashTagListGraphData> groupHashTagListGraphData( final List<HashTagListGraphData> graphDatas) { final List<HashTagListGraphData> newList = new ArrayList<HashTagListGraphData>(); for (HashTagListGraphData hashTagListGraphData : graphDatas) { int positionCurrentElement = newList.indexOf(hashTagListGraphData); if (positionCurrentElement != -1) { final HashTagListGraphData internalElement = newList.get(positionCurrentElement); internalElement.setValue(internalElement.getValue() + hashTagListGraphData.getValue()); } else { newList.add(hashTagListGraphData); } } return newList; } /** * * @param itemList * @param period * @param request * @return * @throws EnMeNoResultsFoundException * @throws EnMeSearchException */ private List<HashTagListGraphData> groupListItemStatDetail(final List<ItemStatDetail> itemList, final SearchPeriods period, final HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { final List<HashTagListGraphData> tagDetailStatsCompare = new ArrayList<HashTagListGraphData>(); for (ItemStatDetail item : itemList) { int month = DateUtil.getValueCurrentMonthOfTheYear(item.getDate()); int year = DateUtil.getValueCurrentYear(item.getDate()); int day = DateUtil.getValueCurrentDateOfTheMonths(item.getDate()); Long value = item.getItemId(); tagDetailStatsCompare.add(this.createHastagItemDetailGraph(year, value, month, day)); } return this.groupHashTagListGraphData(tagDetailStatsCompare); } /* * (non-Javadoc) * * @see org.encuestame.core.service.imp.IStatisticsService# * getTotalUsagebyHashtagAndDateRangeGraph(java.lang.String, * org.encuestame.utils.enums.SearchPeriods, * javax.servlet.http.HttpServletRequest) */ public List<HashTagListGraphData> getTotalUsagebyHashtagAndDateRangeListGraph(final String hashTagName, final SearchPeriods period, final HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { // Check if the hashtag exists /* labels : ["January","February","March","April","May","June","July"], datasets : [ { fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", pointColor : "rgba(220,220,220,1)", pointStrokeColor : "#fff", data : [65,59,90,81,56,55,40] } ] */ final HashTag tag = this.getHashTag(hashTagName, true); final List<Object[]> tweetPollsByDateRange = new ArrayList<Object[]>(); final List<Object[]> pollsByDateRange = new ArrayList<Object[]>(); final List<Object[]> surveysByDateRange = new ArrayList<Object[]>(); final List<ItemStatDetail> itemStatDetailByUsage = new ArrayList<ItemStatDetail>(); // If the tag exists then obtains the total final List<HashTagListGraphData> tagDetailStatsByTagName = new ArrayList<HashTagListGraphData>(); // from database tweetPollsByDateRange.addAll(this.getTweetPollsRangeStats(tag.getHashTag(), period)); pollsByDateRange.addAll(this.getPollsRangeStats(tag.getHashTag(), period)); surveysByDateRange.addAll(this.getSurveysRangeStats(tag.getHashTag(), period)); // object conversion itemStatDetailByUsage.addAll(ConvertDomainBean.convertObjectListToItemDetailBean(tweetPollsByDateRange)); itemStatDetailByUsage.addAll(ConvertDomainBean.convertObjectListToItemDetailBean(pollsByDateRange)); itemStatDetailByUsage.addAll(ConvertDomainBean.convertObjectListToItemDetailBean(surveysByDateRange)); tagDetailStatsByTagName.addAll(this.groupListItemStatDetail(itemStatDetailByUsage, period, request)); return tagDetailStatsByTagName; } /* * (non-Javadoc) * @see org.encuestame.core.service.imp.IStatisticsService#getTotalSocialLinksbyHashTagUsageAndDateRangeListGraph(java.lang.String, org.encuestame.utils.enums.SearchPeriods, javax.servlet.http.HttpServletRequest) */ @Override public List<HashTagListGraphData> getTotalSocialLinksbyHashTagUsageAndDateRangeListGraph(String tagName, SearchPeriods period, HttpServletRequest request) throws EnMeSearchException, EnMeNoResultsFoundException { List<HashTagListGraphData> tagDetailStatsBySocial = new ArrayList<HashTagListGraphData>(); List<ItemStatDetail> tpSocialSavePublishedDetail = new ArrayList<ItemStatDetail>(); List<TweetPollSavedPublishedStatus> tpSavedPublished = new ArrayList<TweetPollSavedPublishedStatus>(); if (period == null) { throw new EnMeSearchException("search params required."); } else { final List<TweetPoll> tpolls = getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); for (TweetPoll tweetPoll : tpolls) { final ItemStatDetail statDetail = new ItemStatDetail(); tpSavedPublished = getTweetPollDao().getSocialLinksByTypeAndDateRange(tweetPoll, null, null, TypeSearchResult.TWEETPOLL); statDetail.setDate(tweetPoll.getCreateDate()); statDetail.setItemId(Long.valueOf(tpSavedPublished.size())); //FIXME: itemId should be the id of something, now store a "total" value. //tpSocialSavePublishedDetail.addAll(ConvertDomainBean.convertTweetPollSavedPublishedStatusListToItemDetailBean(tpSavedPublished)); tpSocialSavePublishedDetail.add(statDetail); } this.removeDuplicatleItemOutOfRange(tpSocialSavePublishedDetail, period.toDays()); tagDetailStatsBySocial .addAll(this.groupListItemStatDetail(tpSocialSavePublishedDetail, period, request)); return tagDetailStatsBySocial; } } /* * (non-Javadoc) * @see org.encuestame.core.service.imp.IStatisticsService#getTotalHitsUsagebyHashTagAndDateRangeListGraph(java.lang.String, org.encuestame.utils.enums.SearchPeriods, javax.servlet.http.HttpServletRequest) */ @Override public List<HashTagListGraphData> getTotalHitsUsagebyHashTagAndDateRangeListGraph(String hashTagName, SearchPeriods period, HttpServletRequest request) throws EnMeNoResultsFoundException, EnMeSearchException { List<Hit> hashTagHits = new ArrayList<Hit>(); List<HashTagListGraphData> tagDetailStatsByHits = new ArrayList<HashTagListGraphData>(); final HashTag tag = this.getHashTag(hashTagName, Boolean.TRUE); List<ItemStatDetail> itemStatDetailByHits = new ArrayList<ItemStatDetail>(); if (tag != null) { hashTagHits = getFrontEndDao().getHashTagHitsbyDateRange(tag.getHashTagId(), period.toDays()); } itemStatDetailByHits.addAll(ConvertDomainBean.convertHitListToItemDetailBean(hashTagHits)); tagDetailStatsByHits = this.groupListItemStatDetail(itemStatDetailByHits, period, request); return tagDetailStatsByHits; } /* * (non-Javadoc) * @see org.encuestame.core.service.imp.IStatisticsService#getTotalVotesbyHashTagUsageAndDateRangeListGraph(java.lang.String, org.encuestame.utils.enums.SearchPeriods, javax.servlet.http.HttpServletRequest) */ @Override public List<HashTagListGraphData> getTotalVotesbyHashTagUsageAndDateRangeListGraph(String tagName, SearchPeriods period, HttpServletRequest request) throws EnMeSearchException, EnMeNoResultsFoundException { List<ItemStatDetail> tpResultsBean = new ArrayList<ItemStatDetail>(); List<TweetPollResult> tpollResults = new ArrayList<TweetPollResult>(); List<TweetPollSwitch> tpollsSwitch = new ArrayList<TweetPollSwitch>(); List<HashTagListGraphData> tagDetailStatsByVotes = new ArrayList<HashTagListGraphData>(); if (period == null) { throw new EnMeSearchException("search params required."); } else { final List<TweetPoll> tpolls = getTweetPollsByHashTag(tagName, null, null, TypeSearchResult.HASHTAG, period); log.debug("Total Tweetpolls by hashtagName" + tpolls.size()); for (TweetPoll tweetPoll : tpolls) { tpollsSwitch = getTweetPollDao().getListAnswersByTweetPollAndDateRange(tweetPoll); log.trace("Total TweetpollSwitch by tweetPoll -->" + tpollsSwitch.size()); for (TweetPollSwitch tweetPollSwitch : tpollsSwitch) { tpollResults = getTweetPollDao().getTweetPollResultsByTweetPollSwitch(tweetPollSwitch); log.trace("Total TweetPollResults by tweetPollSwitch -->" + tpollResults.size()); tpResultsBean .addAll(ConvertDomainBean.convertTweetPollResultListToItemDetailBean(tpollResults)); } } } this.removeDuplicatleItemOutOfRange(tpResultsBean, period.toDays()); tagDetailStatsByVotes = this.groupListItemStatDetail(tpResultsBean, period, request); return tagDetailStatsByVotes; } }