r525 - in trunk: faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service
Author: echatellier Date: 2014-08-12 16:12:49 +0200 (Tue, 12 Aug 2014) New Revision: 525 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/525 Log: Remove lazy fetch and add fetch into hql Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java 2014-08-12 14:00:32 UTC (rev 524) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java 2014-08-12 14:12:49 UTC (rev 525) @@ -34,10 +34,19 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; -import org.apache.commons.lang3.tuple.Pair; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.pagination.PaginationParameter; import org.nuiton.util.pagination.PaginationResult; +import com.google.common.base.Function; +import com.google.common.base.Objects; +import com.google.common.base.Splitter; +import com.google.common.base.Strings; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { /** @@ -50,7 +59,8 @@ */ public PaginationResult<Email> search(EmailFilter emailFilter, Set<MailFolder> readMailFolders, PaginationParameter pagination) { - StringBuilder query = new StringBuilder("FROM " + Email.class.getName() + " E"); + //StringBuilder query = new StringBuilder("FROM " + Email.class.getName() + " E"); + StringBuilder query = new StringBuilder(); Map<String, Object> args = new HashMap<>(); // apply security @@ -353,8 +363,39 @@ query.append(")"); } - // compute paginated - PaginationResult<Email> result = findPage(query.toString(), args, pagination); + // add same fecth liste as emailService#getEmailForFolder() + String hqlForFetchStep1 = "select E." + TopiaEntity.PROPERTY_TOPIA_ID + " FROM " + Email.class.getName() + " E " + query.toString(); + String hqlForFetchStep2 = "select distinct E FROM " + Email.class.getName() + " E " + addAllFecthes( + Email.PROPERTY_PRIORITY, + Email.PROPERTY_DEMAND_TYPE, + Email.PROPERTY_CLIENT, + Email.PROPERTY_RANGE_ROW + "." + RangeRow.PROPERTY_RANGE, + Email.PROPERTY_ETAT_ATTENTE, + Email.PROPERTY_TAKEN_BY, + Email.PROPERTY_REPLIES, + Email.PROPERTY_ATTACHMENT, + Email.PROPERTY_HISTORY + "." + History.PROPERTY_FAX_TO_MAIL_USER, + Email.PROPERTY_HISTORY + "." + History.PROPERTY_FIELDS, + Email.PROPERTY_EMAIL_GROUP + "." + EmailGroup.PROPERTY_EMAIL) + + " WHERE E." + TopiaEntity.PROPERTY_TOPIA_ID + " in ( :topiaIdsForFetch_ )"; + + // code copied from topia to perform search + PaginationResult<String> pageResult = findPage(hqlForFetchStep1, args, pagination); + List<String> step1ResultTopiaIds = pageResult.getElements(); + + List<Email> sortedEntities; + if (CollectionUtils.isEmpty(step1ResultTopiaIds)) { + sortedEntities = Lists.newArrayList(); + } else { + Map<String, Object> step2Args = Maps.newHashMap(); + step2Args.put("topiaIdsForFetch_", step1ResultTopiaIds); + List<Email> entities = forHql(hqlForFetchStep2, step2Args).findAll(); + + sortedEntities = sortAccordingToIds(entities, step1ResultTopiaIds); + } + + PaginationResult<Email> result = PaginationResult.of(sortedEntities, pageResult.getCount(), pageResult.getCurrentPage()); + //PaginationResult<Email> result = findPage(query.toString(), args, pagination); return result; } @@ -420,4 +461,72 @@ // params.put("emailIds", emailIds); // List<Pair<String, FaxToMailUser>> result = findAll(query, params); // } + + /** + * @deprecated beacause this need to be supported by topia (see http://forge.nuiton.org/issues/3427) + */ + @Deprecated + protected String addAllFecthes(String... fetchProperties) { + StringBuilder hqlFromClauseBuilder = new StringBuilder(); + //if (includeFetch) { + int fetchedPropertiesAliasIndex = 0; + Map<String, String> aliases = Maps.newHashMap(); + for (String propertyName : fetchProperties) { + + // addAllFetches("a.b").addAllFetches("i.j.k") will produce: + // left join topiaEntity_.a fetchedProp0_ left join fetch fetchedProp0_.b + // left join topiaEntity_.i fetchedProp1_ left join fetch fetchedProp1_.j fetchedProp2_ left join fetchedProp2_.k + + // addAllFetches("a.b").addAllFetches("a.c") will produce: + // left join topiaEntity_.a fetchedProp0_ left join fetch fetchedProp1_.b + // left join fetch fetchedProp1_.c + StringBuilder path = new StringBuilder(); // The path to reach the property + + // Loop over each part of the "a.b.c" + for (String part : Splitter.on('.').split(propertyName)) { + + // Look for the parent alias if already computed + String previousPath = path.toString(); + String previousAlias = Objects.firstNonNull(aliases.get(previousPath), "E"); + + // Compute the current path and look for its alias + if (path.length() > 0) { + path.append('.'); + } + path.append(part); + String currentPath = path.toString(); + String currentAlias = aliases.get(currentPath); + + // No current alias found, create and add it + if (Strings.isNullOrEmpty(currentAlias)) { + currentAlias = String.format("fetchedProp%d_", fetchedPropertiesAliasIndex++); + aliases.put(currentPath, currentAlias); + + String fetch = String.format(" LEFT JOIN FETCH %s.%s %s ", previousAlias, part, currentAlias); + hqlFromClauseBuilder.append(fetch); + } + } + } + //} + return hqlFromClauseBuilder.toString(); + } + + /** + * @deprecated beacause this need to be supported by topia (see http://forge.nuiton.org/issues/3427) + */ + @Deprecated + protected <O extends TopiaEntity> List<O> sortAccordingToIds(List<O> entities, final List<String> idsList) { + + // Cannot sort on second query, will sort according to the first result list + final Map<String, O> entitiesIndex = Maps.uniqueIndex(entities, TopiaEntities.getTopiaIdFunction()); + Iterable<O> transformed = Iterables.transform(idsList, new Function<String, O>() { + @Override + public O apply(String input) { + return entitiesIndex.get(input); + } + }); + + List<O> result = Lists.newArrayList(transformed); + return result; + } } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-08-12 14:00:32 UTC (rev 524) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-08-12 14:12:49 UTC (rev 525) @@ -796,11 +796,6 @@ EmailTopiaDao emailDao = getPersistenceContext().getEmailDao(); PaginationResult<Email> result = emailDao.search(emailFilter, readMailFolders, pagination); - // Fetch lazy field for list display - for (Email email : result.getElements()) { - fetchEmailData(email); - } - return result; } @@ -1174,37 +1169,6 @@ } } - protected void fetchEmailData(Email email) { - if (email.getDemandType() != null) { - Hibernate.initialize(email.getDemandType().getFields()); - } - if (email.sizeRangeRow() > 0) { - for (RangeRow rangeRow : email.getRangeRow()) { - Hibernate.initialize(rangeRow.getRange()); - } - } - if (email.sizeHistory() > 0) { - for (History history : email.getHistory()) { - history.getType(); - Hibernate.initialize(history.getType()); - Hibernate.initialize(history.getFaxToMailUser()); - history.sizeFields(); - } - } - email.sizeReplies(); - email.sizeAttachment(); - - Hibernate.initialize(email.getTakenBy()); - Hibernate.initialize(email.getClient()); - Hibernate.initialize(email.getDemandStatus()); - - if (email.getEmailGroup() != null) { - email.getEmailGroup().sizeEmail(); - } - Hibernate.initialize(email.getEtatAttente()); - Hibernate.initialize(email.getPriority()); - } - /** * Compute mail folder path (separated by /) from root to current. *
participants (1)
-
echatellier@users.forge.codelutin.com