Author: fdesbois Date: 2010-06-02 17:08:28 +0200 (Wed, 02 Jun 2010) New Revision: 3025 Url: http://chorem.org/repositories/revision/pollen/3025 Log: Change some queries using Join + tests Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java trunk/pollen-business/src/main/xmi/pollen.properties trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java trunk/pollen-business/src/test/resources/PollenTest.properties trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsCreated.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsParticipated.java Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenUtils.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -49,7 +49,7 @@ * @param element * @param collection * @return the TopiaQuery created - * @see #prepareQuery(TopiaQuery, Filter, EntityQueryProperty) + * @see #prepareQuery(TopiaQuery, Filter, String, EntityQueryProperty) */ public static TopiaQuery createQueryFindElementsByCollection( EntityQueryProperty element, @@ -69,21 +69,25 @@ if (filter != null) { // Add constraints from filter, the collection is given to provide // the name of its ID property. - prepareQuery(query, filter, collection); + prepareQuery(query, filter, null, collection); } return query; } + public static void prepareQuery(TopiaQuery query, Filter filter) { + prepareQuery(query, filter, null, null); + } + /** * Prepare a query with filter : adding startIndex and endIndex as limit * and orderBy if defined. Need an existing query in builder. * * @param filter Filter to add in the query - * @see #prepareQuery(TopiaQuery, Filter, EntityQueryProperty) + * @see #prepareQuery(TopiaQuery, Filter, String, EntityQueryProperty) */ - public static void prepareQuery(TopiaQuery query, Filter filter) { - prepareQuery(query, filter, null); + public static void prepareQuery(TopiaQuery query, Filter filter, String mainAlias) { + prepareQuery(query, filter, mainAlias, null); } /** @@ -95,15 +99,19 @@ * @param reference used to filter on referenceId */ public static void prepareQuery(TopiaQuery query, Filter filter, - EntityQueryProperty reference) { + String mainAlias, + EntityQueryProperty reference) { Integer startIndex = filter.getStartIndex(); Integer endIndex = filter.getEndIndex(); String orderBy = filter.getOrderBy(); String referenceId = filter.getReferenceId(); + if (mainAlias == null) { + mainAlias = query.getMainAlias(); + } EntityQueryProperty mainProperty = - getEntityQueryProperty(query.getMainAlias()); + getEntityQueryProperty(mainAlias); if (log.isDebugEnabled()) { log.debug("Filter added to the query : " + Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountDAOImpl.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -17,19 +17,22 @@ @Override public TopiaQuery createQueryFindAllByPoll(Filter filter) { - EntityQueryProperty accountProperty = - PollenUtils.getEntityQueryProperty(PollAccount.class, "A"); + String pollAlias = "P"; + String pollAccountProperty = + TopiaQuery.getProperty(pollAlias, Poll.POLL_ACCOUNT); - EntityQueryProperty pollProperty = - PollenUtils.getEntityQueryProperty(Poll.class, "P"); + String participantAlias = "A"; + String participantVoteDateProperty = + TopiaQuery.getProperty(participantAlias, PollAccount.VOTE_DATE); - pollProperty.setPropertyJoin(Poll.POLL_ACCOUNT); + // Will return lists in case of GROUP poll + TopiaQuery query = new TopiaQuery(Poll.class, pollAlias). + setSelect(participantAlias). + addJoin(pollAccountProperty, participantAlias, false). + addNotNull(participantVoteDateProperty); - TopiaQuery query = PollenUtils.createQueryFindElementsByCollection( - accountProperty, pollProperty, filter); + PollenUtils.prepareQuery(query, filter, participantAlias); - query.addNotNull(accountProperty.nameProperty(PollAccount.VOTE_DATE)); - return query; } } Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -28,11 +28,13 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaQuery; +import org.nuiton.topia.persistence.TopiaEntity; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -297,29 +299,99 @@ throws TopiaException { PollDAO dao = PollenDAOHelper.getPollDAO(transaction); + Map<PollAccount, Poll> polls = new LinkedHashMap<PollAccount, Poll>(); - TopiaQuery query = dao.createQuery("P").addDistinct(). - addFrom(PollAccount.class, "A"). - addFrom(PollAccount.class, "G"). - addInElements("G", "P." + Poll.POLL_ACCOUNT). - addEquals("A." + PollAccount.USER_ACCOUNT, user). - addWhere("A IN elements (P." + Poll.POLL_ACCOUNT + ") OR " + - "A IN elements (G." + PollAccount.CHILD + ") OR " + - "A = P." + Poll.CREATOR); + // Property names for poll + String pollAlias = "P"; + String pollCreatorProperty = + TopiaQuery.getProperty(pollAlias, Poll.CREATOR); + String pollAccountProperty = + TopiaQuery.getProperty(pollAlias, Poll.POLL_ACCOUNT); + String pollCreateDateProperty = + TopiaQuery.getProperty(pollAlias, TopiaEntity.TOPIA_CREATE_DATE); - Map<PollAccount, Poll> polls = new HashMap<PollAccount, Poll>(); + // Property names for participant + String participantAlias = "A"; + String participantUserProperty = + TopiaQuery.getProperty(participantAlias, PollAccount.USER_ACCOUNT); - List<Object[]> results = transaction.findByQuery(query.addSelect("A")); + // Property names for participant list + String listAlias = "G"; + String listChildProperty = + TopiaQuery.getProperty(listAlias, PollAccount.CHILD); - for (Object[] result : results) { - Poll poll = (Poll)result[0]; - PollAccount account = (PollAccount)result[1]; - polls.put(account, poll); - } + // ALGO 1 with three queries : can't keep order, need Comparator +// // Case 1 : creator +// TopiaQuery queryCreator = dao.createQuery(pollAlias). +// addSelect(participantAlias). +// addJoin(pollCreatorProperty, participantAlias). +// addEquals(participantUserProperty, user); +// +// preparePollResults(transaction, queryCreator, polls); +// +// // Case 2 : participants (direct accounts) +// TopiaQuery queryParticipants = dao.createQuery(pollAlias). +// addSelect(participantAlias). +// addJoin(pollAccountProperty, participantAlias). +// addEquals(participantUserProperty, user); +// +// preparePollResults(transaction, queryParticipants, polls); +// +// // Case 3 : by groups (child accounts) +// TopiaQuery queryGroups = dao.createQuery(pollAlias). +// addSelect(participantAlias). +// addJoin(pollAccountProperty, groupAlias). +// addJoin(groupChildProperty, participantAlias). +// addEquals(participantUserProperty, user); +// +// preparePollResults(transaction, queryGroups, polls); + // ALGO 2 with one query and ordered + TopiaQuery query = dao.createQuery(pollAlias). + addDistinct(). + addSelect(participantAlias). + addLeftJoin(pollAccountProperty, listAlias, false). + addFrom(PollAccount.class, participantAlias). + addEquals(participantUserProperty, user). + addOrderDesc(pollCreateDateProperty); + + StringBuilder orBuilder = new StringBuilder(participantAlias). + // IN poll.pollAccount (NORMAL) + append(" IN (").append(listAlias).append(')'). + append(" OR ").append(participantAlias). + // IN poll.pollAccount.child (GROUP) + append(" IN elements(").append(listChildProperty).append(')'). + append(" OR ").append(participantAlias). + // = poll.creator (CREATOR) + append(" = ").append(pollCreatorProperty); + + query.addWhere(orBuilder.toString()); + + log.debug("Query : " + query); + + preparePollResults(transaction, query, polls); + return polls; } + protected void preparePollResults(TopiaContext transaction, + TopiaQuery query, + Map<PollAccount, Poll> results) + throws TopiaException { + + List<Object[]> queryResults = transaction.findByQuery(query); + for (Object[] row : queryResults) { + Poll poll = (Poll)row[0]; + PollAccount account = (PollAccount)row[1]; + log.debug("account : " + account.getUid() + " : " + + account.getName() + + " list(" + account.isList() + ")" + + " admin(" + account.isAdmin() + ")" + + " for poll " + poll.getTitle()); + results.put(account, poll); + } + } + @Override protected List<Comment> executeGetComments(TopiaContext transaction, Poll poll, int startIndex, int endIndex) @@ -384,10 +456,18 @@ PollDAO dao = PollenDAOHelper.getPollDAO(transaction); +// TopiaQuery query = dao.createQuery(). +// addLoad(properties). +// addEquals(Poll.UID, pollUid); + TopiaQuery query = dao.createQuery(). - addEquals(Poll.UID, pollUid). - addLoad(properties); + addFetch(properties); + String pollUidProperty = + TopiaQuery.getProperty(query.getMainAlias(), Poll.UID); + + query.addEquals(pollUidProperty, pollUid); + Poll result = dao.findByQuery(query); if (result == null) { throw new PollenBusinessException( Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java =================================================================== --- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceVoteImpl.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -208,9 +208,9 @@ PollAccountDAO dao = PollenDAOHelper.getPollAccountDAO(transaction); TopiaQuery query = dao.createQueryFindAllByPoll(filter); + + //query.addLoad(PollAccount.CHOICE_VOTE); - query.addLoad(PollAccount.CHOICE_VOTE); - List<PollAccount> results = dao.findAllByQuery(query); if (log.isDebugEnabled()) { Modified: trunk/pollen-business/src/main/xmi/pollen.properties =================================================================== --- trunk/pollen-business/src/main/xmi/pollen.properties 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/main/xmi/pollen.properties 2010-06-02 15:08:28 UTC (rev 3025) @@ -12,7 +12,7 @@ org.chorem.pollen.entity.PollAccount.attribute.uid.tagvalue.naturalId=true -org.chorem.pollen.entity.Vote.attribute.choice.tagvalue.lazy=false +#org.chorem.pollen.entity.Vote.attribute.choice.tagvalue.lazy=false org.chorem.pollen.entity.FavoriteList.attribute.userAccount.tagvalue.naturalId=true org.chorem.pollen.entity.FavoriteList.attribute.name.tagvalue.naturalId=true Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java =================================================================== --- trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -4,8 +4,10 @@ import org.apache.commons.logging.LogFactory; import org.chorem.pollen.PollenBusinessException; import org.chorem.pollen.PollenDAOHelper; +import org.chorem.pollen.bean.Filter; import org.chorem.pollen.common.ChoiceType; import org.chorem.pollen.common.PollType; +import org.chorem.pollen.common.VoteCountingType; import org.chorem.pollen.entity.Choice; import org.chorem.pollen.entity.FavoriteList; import org.chorem.pollen.entity.Participant; @@ -16,6 +18,7 @@ import org.chorem.pollen.entity.PollDAO; import org.chorem.pollen.entity.PollImpl; import org.chorem.pollen.entity.UserAccount; +import org.chorem.pollen.entity.Vote; import org.chorem.pollen.test.AbstractServiceTest; import org.junit.Assert; import org.junit.Test; @@ -332,18 +335,69 @@ } @Test - public void testGetPollsByUser2() throws PollenBusinessException, TopiaException { + public void testGetPollsByUser() throws PollenBusinessException, TopiaException { - poll = createGroupPoll("POLL", user, null, 3, "group1", "group2"); + createGroupPoll("POLL", user, null, 3, "group1", "group2"); + Poll freePoll = createFreePoll("POLL2", user, null); + + PollAccount participant = getServiceVote().getNewPollAccount(user); + participant.setChoiceVote(new ArrayList<Vote>()); + + getServiceVote().saveVote(freePoll, participant); + + /** EXEC METHOD **/ Map<PollAccount, Poll> polls = servicePoll.getPollsByUser(user); - for (Map.Entry<PollAccount, Poll> poll : polls.entrySet()) { - log.debug("Poll : " + poll.getValue().getTitle()); - log.debug("Account : " + poll.getKey().getName() + - " admin (" + poll.getKey().isAdmin() + ")"); + // POLL 2 : user both creator and participant (+2) + // POLL : user creator + added in each group (+3) + + Assert.assertEquals(5, polls.size()); + } + + @Test + public void testFetchOnGetter() throws TopiaException, PollenBusinessException { + + poll = createFreePoll("POLL2", user, VoteCountingType.NORMAL); + List<Choice> choices = + addChoicesToPoll(poll, ChoiceType.TEXT, "choice1", "choice2", "choice3"); + + PollAccount participant = getServiceVote().getNewPollAccount(user); + Vote voteImpl = getServiceVote().getNewVote(choices.get(0)); + voteImpl.setVoteValue(1.); + participant.addChoiceVote(voteImpl); + voteImpl = getServiceVote().getNewVote(choices.get(1)); + voteImpl.setVoteValue(1.); + participant.addChoiceVote(voteImpl); + voteImpl = getServiceVote().getNewVote(choices.get(2)); + voteImpl.setVoteValue(1.); + participant.addChoiceVote(voteImpl); + + getServiceVote().saveVote(poll, participant); + + poll = loadEntity(poll); + + /** EXEC METHOD **/ + + Poll pollFound = servicePoll.getPoll(poll.getUid(), Poll.CHOICE); + + Filter filter = new Filter(); + filter.setReference(pollFound); + List<PollAccount> accounts = getServiceVote().getVotes(filter); + + for (PollAccount account : accounts) { + log.debug("Account : " + account.getUid()); } - + Assert.assertEquals(1, accounts.size()); + + Assert.assertNotNull(accounts.get(0).getChoiceVote()); + Assert.assertEquals(3, accounts.get(0).getChoiceVote().size()); + + for (Vote vote : accounts.get(0).getChoiceVote()) { + log.debug("Vote choice : " + vote.getChoice().getName() + + " value=" + vote.getVoteValue()); + } + } } Modified: trunk/pollen-business/src/test/resources/PollenTest.properties =================================================================== --- trunk/pollen-business/src/test/resources/PollenTest.properties 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-business/src/test/resources/PollenTest.properties 2010-06-02 15:08:28 UTC (rev 3025) @@ -1,5 +1,5 @@ hibernate.hbm2ddl.auto=create -hibernate.show_sql=false +hibernate.show_sql=true hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.connection.username=sa hibernate.connection.password= Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -594,7 +594,7 @@ public String getParticipantNameStyle() { if (!participant.isAnonymous() && - participant.getName().equals(getPollAccount().getName())) { + participant.getUid().equals(getPollAccount().getUid())) { return "selected"; } return evenOdd.getNext(); Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsCreated.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsCreated.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsCreated.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -105,7 +105,7 @@ public void onActivate() { super.onActivate(); if (isUserConnected()) { - polls = servicePoll.getPollsByUser(getUserConnected()); + //polls = servicePoll.getPollsByUser(getUserConnected()); } } } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsParticipated.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsParticipated.java 2010-06-02 10:31:35 UTC (rev 3024) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserPollsParticipated.java 2010-06-02 15:08:28 UTC (rev 3025) @@ -87,8 +87,7 @@ public void onActivate() { super.onActivate(); if (isUserConnected()) { - invitedPolls = participatedPolls = servicePoll.getPollsByUser( - getUserConnected()); + //invitedPolls = participatedPolls = servicePoll.getPollsByUser(getUserConnected()); // invitedPolls = servicePoll.findInvitedPolls(user.getId()); } }