r2910 - in branches/pollen-1.2.3-1.2.x: pollen-business/src/main/java/org/chorem/pollen/business/converters pollen-business/src/main/java/org/chorem/pollen/business/services pollen-ui/src/main/java/org/chorem/pollen/ui/components pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll pollen-ui/src/main/webapp/poll
Author: fdesbois Date: 2010-03-09 16:59:47 +0100 (Tue, 09 Mar 2010) New Revision: 2910 Log: Optimize votes loading on voteForPoll page + add links for first page and last page on pager Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/converters/DataPollConverter.java 2010-03-09 15:59:47 UTC (rev 2910) @@ -120,14 +120,14 @@ pollDTO.setChoiceDTOs(choiceConverter.createChoiceDTOs(ePoll .getChoice())); } - if (ePoll.getVote().size() > 0) { - // FD-20100308 Votes are not loaded for an anonymous vote : - // see ref ANO #130 - if (!ePoll.getAnonymous()) { - pollDTO.setVoteDTOs(voteConverter.createVoteDTOs(ePoll.getVote())); - } - pollDTO.setNbVotes(ePoll.getVote().size()); - } +// if (ePoll.getVote().size() > 0) { +// // FD-20100308 Votes are not loaded for an anonymous vote : +// // see ref ANO #130 +// if (!ePoll.getAnonymous()) { +// pollDTO.setVoteDTOs(voteConverter.createVoteDTOs(ePoll.getVote())); +// } +// pollDTO.setNbVotes(ePoll.getVote().size()); +// } if (ePoll.getComment().size() > 0) { pollDTO.setCommentDTOs(commentConverter.createCommentDTOs(ePoll .getComment())); Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServicePollImpl.java 2010-03-09 15:59:47 UTC (rev 2910) @@ -239,6 +239,14 @@ if (pollEntity != null) { converter.setTransaction(transaction); result = converter.createPollDTO(pollEntity); + // Need the number total of votes to push in the dto + List<Long> tmp = transaction.find( + "SELECT COUNT(*)" + + " FROM " + Vote.class.getName() + + " WHERE poll.pollId = :pollUId", + "pollUId", pollId); + int count = tmp.get(0).intValue(); + result.setNbVotes(count); } transaction.commitTransaction(); Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVote.java 2010-03-09 15:59:47 UTC (rev 2910) @@ -20,6 +20,7 @@ import java.util.Map; import org.chorem.pollen.business.dto.PollAccountDTO; +import org.chorem.pollen.business.dto.PollDTO; import org.chorem.pollen.business.dto.VoteDTO; /** @@ -54,6 +55,20 @@ public boolean deleteVote(String voteId); /** + * Retrieve existings votes from the {@code poll}. Only needed votes inside + * the range ({@code startIndex} and {@code endIndex}) will be retrieve. + * The results will be ordered by creationDate (the last vote done will + * be at the end of the list). + * + * @param poll to retrieve votes + * @param startIndex begin range for resulting votes + * @param endIndex end range for resulting votes + * @return the votes corresponding to the poll between the range + */ + public List<VoteDTO> getVotesByPoll(PollDTO poll, + int startIndex, int endIndex); + + /** * Retourne les votes d'un sondage * * @param properties La HashMap pour sélectionner les votes d'un sondage. Il Modified: branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-business/src/main/java/org/chorem/pollen/business/services/ServiceVoteImpl.java 2010-03-09 15:59:47 UTC (rev 2910) @@ -16,6 +16,7 @@ package org.chorem.pollen.business.services; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -24,9 +25,12 @@ import org.chorem.pollen.business.converters.DataPollAccountConverter; import org.chorem.pollen.business.converters.DataVoteConverter; import org.chorem.pollen.business.dto.PollAccountDTO; +import org.chorem.pollen.business.dto.PollDTO; import org.chorem.pollen.business.dto.VoteDTO; +import org.chorem.pollen.business.persistence.Poll; import org.chorem.pollen.business.persistence.PollAccount; import org.chorem.pollen.business.persistence.PollAccountDAO; +import org.chorem.pollen.business.persistence.PollDAO; import org.chorem.pollen.business.persistence.PollenModelDAOHelper; import org.chorem.pollen.business.persistence.Vote; import org.chorem.pollen.business.persistence.VoteDAO; @@ -174,6 +178,60 @@ } } + public List<VoteDTO> getVotesByPoll(PollDTO poll, + int startIndex, int endIndex) { + TopiaContext transaction = null; + List<VoteDTO> results = new ArrayList<VoteDTO>(); + try { + // No need to load votes for an anonymous poll + if (poll.isAnonymous()) { + return results; + } + + // FIXME-FD20100309 : change model to suppress link from poll to vote + // It's not necessary to have votes when retrieving the poll, this + // method do this job only when it's needed + + if (log.isDebugEnabled()) { + log.debug("Load votes for poll with uid = " + poll.getPollId()); + log.debug("LIMIT : startIndex = " + startIndex + " _ " + + "endIndex = " + endIndex); + } + + transaction = rootContext.beginTransaction(); + + // FIXME : refactor this to use TopiaQuery from ToPIA 2.3 + // Order the results by creation date (the last vote done will be + // at the end of the list) + List<Vote> votes = transaction.find( + "FROM " + Vote.class.getName() + + " WHERE poll.pollId = :pollUId" + + " ORDER BY topiaCreateDate", + startIndex, endIndex, + "pollUId", poll.getPollId()); + + if (log.isDebugEnabled()) { + log.debug("Nb votes found : " + votes.size()); + } + +// PollDAO dao = PollenModelDAOHelper.getPollDAO(transaction); +// Poll ePoll = dao.findByPollId(poll.getPollId()); + +// if (ePoll != null) { + converter.setTransaction(transaction); + results = converter.createVoteDTOs(votes); +// } + + } catch (Exception eee) { + ContextUtil.doCatch(eee, transaction, + "Unable to load votes from poll with uid = " + + poll.getPollId()); + } finally { + ContextUtil.doFinally(transaction); + } + return results; + } + @Override public List<VoteDTO> selectVotes(Map<String, Object> properties) { TopiaContext transaction = null; Modified: branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Pager.java 2010-03-09 15:59:47 UTC (rev 2910) @@ -5,6 +5,7 @@ import org.apache.tapestry5.EventConstants; import org.apache.tapestry5.Link; import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.annotations.Log; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; @@ -33,7 +34,8 @@ /** * Main element of the pager, the page which contains the pager have * to manage this property (using @Persist for exemple) to ensure that - * the pager will done its work correctly. + * the pager will done its work correctly. You can use + * {@link #getFirstPage() } to initialize the first page. */ @Parameter(required = true) private int currentPage; @@ -61,18 +63,31 @@ log.debug("has previous : " + hasPrevious()); log.debug("has next : " + hasNext()); log.debug("indexes from : " + getStartIndex() + " to " + getEndIndex()); + log.debug("last page : " + getLastPage()); } writer.element("div", "class", "p-pager"); if (hasPrevious()) { - writeLink(writer, currentPage - 1, "< ", "p-pager-previous"); + int previousPage = currentPage - 1; + if (previousPage != getFirstPage()) { + writeLink(writer, getFirstPage(), "<<", "p-pager-first"); + writer.write(" "); + } + writeLink(writer, previousPage, "<", "p-pager-previous"); + writer.write(" "); } writer.element("strong"); writer.write(getFirstValue() + " - " + getLastValue() + " " + messages.get("over") + " " + nbTotalRows); writer.end(); if (hasNext()) { - writeLink(writer, currentPage + 1, " >", "p-pager-next"); + int nextPage = currentPage + 1; + writer.write(" "); + writeLink(writer, nextPage, ">", "p-pager-next"); + if (nextPage != getLastPage()) { + writer.write(" "); + writeLink(writer, getLastPage(), ">>", "p-pager-last"); + } } writer.end(); } @@ -147,6 +162,15 @@ return getEndIndex() < (nbTotalRows - 1); } + public int getFirstPage() { + return 1; + } + + @Log + public int getLastPage() { + return (int)Math.ceil((double)nbTotalRows / (double)nbRowsPerPage); + } + /** * Action event for changing page. The currentPage is changed to * {@code newPage}. Modified: branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-03-09 15:59:47 UTC (rev 2910) @@ -302,7 +302,7 @@ public String getVoteSizeMessage() { if (log.isDebugEnabled()) { - log.debug("poll voteDTOs list size : " + poll.getVoteDTOs().size()); + log.debug("poll voteDTOs list size : " + getVotes().size()); log.debug("poll nbVotes : " + poll.getNbVotes()); } return messages.format("vote-size", poll.getNbVotes()); @@ -380,7 +380,7 @@ // mise à jour du vote ou création d'un nouveau vote if (alreadyVoted) { - for (VoteDTO v : poll.getVoteDTOs()) { + for (VoteDTO v : getVotes()) { PollAccountDTO voteAccount = servicePollAccount .findPollAccountById(v.getPollAccountId()); @@ -402,13 +402,16 @@ getResultsAsString()); sendMailNotification(); voteFeedback.addInfo(messages.get("vote-success")); + page = pager.getLastPage(); + // Reset votes to reload them depends on page change. + votes = null; } voteChoices.clear(); return pollZone.getBody(); } private void deleteVote(String voteId) { - for (VoteDTO vote : poll.getVoteDTOs()) { + for (VoteDTO vote : getVotes()) { if (vote.getId().equals(voteId)) { List<ChoiceDTO> choiceDTOs = vote.getChoiceDTOs(); @@ -520,7 +523,7 @@ private boolean hasAlreadyVoted(String votingId) { // comparaison du votant (pollAccount) avec les votants des votes existants - for (VoteDTO vote : poll.getVoteDTOs()) { + for (VoteDTO vote : getVotes()) { PollAccountDTO account = servicePollAccount .findPollAccountById(vote.getPollAccountId()); @@ -546,10 +549,10 @@ // parcours des votes pour trouver celui correspondant au votingId // et contrôle du droit de modification - while (i < poll.getVoteDTOs().size() && !modifAllowed) { + while (i < getVotes().size() && !modifAllowed) { // account : compte associé au vote courant - String id = poll.getVoteDTOs().get(i).getPollAccountId(); + String id = getVotes().get(i).getPollAccountId(); PollAccountDTO account = servicePollAccount.findPollAccountById(id); // si le votant du vote correspond au votingId @@ -629,7 +632,7 @@ for (PreventRuleDTO rule : poll.getPreventRuleDTOs()) { PreventRuleManager manager = new PreventRuleManager(rule); - manager.execute("vote", poll.getVoteDTOs().size(), data); + manager.execute("vote", getVotes().size(), data); } } @@ -1164,7 +1167,7 @@ countPoll(); } - /************** PAGER MANAGMENT *******************************************/ + /************** PAGER AND VOTES MANAGMENT *********************************/ @InjectComponent private Pager pager; @@ -1175,7 +1178,7 @@ private Integer page; public int getPage() { - return page == null ? 1 : page; + return page == null ? pager.getFirstPage() : page; } @Log @@ -1185,11 +1188,16 @@ public List<VoteDTO> getVotes() { if (votes == null) { - votes = new ArrayList<VoteDTO>(); - List<VoteDTO> all = poll.getVoteDTOs(); - for (int i = pager.getStartIndex(); i <= pager.getEndIndex(); i++) { - votes.add(all.get(i)); +// votes = new ArrayList<VoteDTO>(); +// List<VoteDTO> all = poll.getVoteDTOs(); +// for (int i = pager.getStartIndex(); i <= pager.getEndIndex(); i++) { +// votes.add(all.get(i)); +// } + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getVotesByPoll]"); } + votes = serviceVote.getVotesByPoll(poll, + pager.getStartIndex(), pager.getEndIndex()); } return votes; } Modified: branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml =================================================================== --- branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml 2010-03-09 12:16:13 UTC (rev 2909) +++ branches/pollen-1.2.3-1.2.x/pollen-ui/src/main/webapp/poll/VoteForPoll.tml 2010-03-09 15:59:47 UTC (rev 2910) @@ -50,7 +50,7 @@ <p>${voteSizeMessage}</p> <t:feedback t:id="voteFeedback"/> <p:else> - <t:pager t:nbRowsPerPage="15" t:nbTotalRows="poll.nbVotes" t:currentPage="page"/> + <t:pager t:nbRowsPerPage="3" t:nbTotalRows="poll.nbVotes" t:currentPage="page"/> </p:else> </t:if> <t:form t:id="voteForm" t:zone="pollZone">
participants (1)
-
fdesbois@users.chorem.org