Author: athimel Date: 2014-05-22 16:53:11 +0200 (Thu, 22 May 2014) New Revision: 3128 Url: http://forge.nuiton.org/projects/topia/repository/revisions/3128 Log: refs-50 #3208 use nuiton-utils refactored pagination classes Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderRunQueryStep.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-05-22 08:43:16 UTC (rev 3127) +++ trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-05-22 14:53:11 UTC (rev 3128) @@ -199,6 +199,13 @@ } + @Test + public void iterateOnEmptyTopiaDAO() throws TopiaException { + for (Person person : dao) { + Assert.fail("No person has been created"); + } + } + protected void createPersons(int number) throws TopiaException { for (int i = 0; i < number; i++) { createPerson("toto" + i); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2014-05-22 08:43:16 UTC (rev 3127) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2014-05-22 14:53:11 UTC (rev 3128) @@ -27,7 +27,7 @@ import com.google.common.base.Optional; import org.nuiton.topia.persistence.event.TopiaEntityListener; import org.nuiton.topia.persistence.event.TopiaEntityVetoable; -import org.nuiton.topia.persistence.pager.TopiaPagerBean; +import org.nuiton.util.pagination.PaginationResult; import java.util.Collection; import java.util.List; @@ -83,7 +83,7 @@ * @return the initialized pager. * @since 3.0 */ - TopiaPagerBean newPager(int pageSize); + <K> PaginationResult<K> newPager(int pageSize); /** * Creates a new pager initialized for the first page of data of the given @@ -98,7 +98,7 @@ * @return the initialized pager. * @since 3.0 */ - TopiaPagerBean newPager(String hql, Map<String, Object> params, int pageSize); + <K> PaginationResult<K> newPager(String hql, Map<String, Object> params, int pageSize); /** * Creates an entity not created without the DAO using any of the others Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderRunQueryStep.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderRunQueryStep.java 2014-05-22 08:43:16 UTC (rev 3127) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderRunQueryStep.java 2014-05-22 14:53:11 UTC (rev 3128) @@ -26,7 +26,7 @@ import java.util.List; -import org.nuiton.topia.persistence.pager.TopiaPagerBean; +import org.nuiton.util.pagination.PaginationParameter; import com.google.common.base.Optional; @@ -119,12 +119,12 @@ List<E> find(int startIndex, int endIndex); - List<E> find(TopiaPagerBean pager); + List<E> find(PaginationParameter page); List<String> findAllIds(); List<String> findIds(int startIndex, int endIndex); - List<String> findIds(TopiaPagerBean pager); + List<String> findIds(PaginationParameter page); } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java 2014-05-22 08:43:16 UTC (rev 3127) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java 2014-05-22 14:53:11 UTC (rev 3128) @@ -24,10 +24,14 @@ * #L% */ +import com.google.common.base.Function; +import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; +import com.google.common.collect.Lists; + import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -55,8 +59,9 @@ import org.nuiton.topia.persistence.event.TopiaEntityVetoable; import org.nuiton.topia.persistence.internal.support.TopiaFiresSupport; import org.nuiton.topia.persistence.util.TopiaUtil; -import org.nuiton.topia.persistence.pager.TopiaPagerBean; -import org.nuiton.util.PagerBeanUtil; +import org.nuiton.util.pagination.PaginationOrder; +import org.nuiton.util.pagination.PaginationParameter; +import org.nuiton.util.pagination.PaginationResult; import java.lang.reflect.InvocationTargetException; import java.util.Collection; @@ -85,6 +90,15 @@ private static Log log = LogFactory.getLog(AbstractTopiaDao.class); + + protected static final Function<PaginationOrder, String> PAGINATION_ORDER_TO_HQL = new Function<PaginationOrder, String>() { + @Override + public String apply(PaginationOrder input) { + String result = String.format("%s %s", input.getClause(), input.isDesc() ? "DESC" : "ASC"); + return result; + } + }; + /** * Default batch size used to iterate on data. * @@ -185,14 +199,14 @@ } @Override - public TopiaPagerBean newPager(int pageSize) { - TopiaPagerBean pager = newPager(newFromClause(), null, pageSize); - return pager; + public <K> PaginationResult<K> newPager(int pageSize) { + PaginationResult<K> result = newPager(newFromClause(), null, pageSize); + return result; } @Override - public TopiaPagerBean newPager(String hql, Map<String, Object> params, int pageSize) { - TopiaPagerBean pager = new TopiaPagerBean(); + public <K> PaginationResult<K> newPager(String hql, Map<String, Object> params, int pageSize) { + PaginationParameter firstPage = PaginationParameter.of(0, pageSize); if (hqlContainsOrderBy(hql)) { @@ -200,10 +214,9 @@ hql = hql.substring(0, hql.toLowerCase().indexOf("order by")); } long count = count("SELECT COUNT(*) " + hql, params); - pager.setRecords(count); - pager.setPageSize(pageSize); - PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager); - return pager; + List<K> emptyList = Lists.newArrayList(); // XXX AThimel 22/05/14 To keep the old behavior, we do not load the elements. Is it correct ? + PaginationResult<K> result = PaginationResult.of(emptyList, count, firstPage); + return result; } @Override @@ -537,28 +550,27 @@ return result; } - protected <K> List<K> find(String hql, Map<String, Object> hqlParameters, TopiaPagerBean pager) { + protected <K> List<K> find(String hql, Map<String, Object> hqlParameters, PaginationParameter page) { Preconditions.checkNotNull(hql); Preconditions.checkNotNull(hqlParameters); - Preconditions.checkNotNull(pager); + Preconditions.checkNotNull(page); - if (StringUtils.isNotBlank(pager.getSortColumn())) { + if (!page.getOrderClauses().isEmpty()) { // can't have a order by clause in hql query Preconditions.checkState( !hqlContainsOrderBy(hql), "An 'order by' clause was already found in hql, can't use the order of the pager"); - hql += " order by " + pager.getSortColumn(); - if (!pager.isSortAscendant()) { - hql += " desc"; - } + hql += " ORDER BY "; + Iterable<String> orderClauses = Iterables.transform(page.getOrderClauses(), PAGINATION_ORDER_TO_HQL); + hql += Joiner.on(", ").join(orderClauses); } List<K> result = topiaJpaSupport.find( hql, - (int) pager.getRecordStartIndex(), - (int) pager.getRecordEndIndex() - 1, + (int) page.getStartIndex(), + (int) page.getEndIndex(), hqlParameters); return result; @@ -652,7 +664,7 @@ @Override public Iterable<E> findAllLazy() { - String hql = "from " + getTopiaEntityEnum().getImplementationFQN() + " order by id"; + String hql = " FROM " + getTopiaEntityEnum().getImplementationFQN() + " ORDER BY id "; Map<String, Object> hqlParameters = Collections.emptyMap(); Iterable<E> result = findAllLazy(hql, hqlParameters); return result; @@ -704,8 +716,10 @@ protected final Map<String, Object> params; - protected final TopiaPagerBean pager; + protected PaginationResult<K> pager; + protected boolean firstPageLoaded; + public FindAllIterator(AbstractTopiaDao<E> dao, int batchSize, String hql, @@ -722,16 +736,16 @@ // empty iterator (will be changed at first next call) data = Iterators.emptyIterator(); + firstPageLoaded = false; } - public boolean hasNext() { boolean result = data.hasNext() || // no more data - pager.getPageIndex() < pager.getPagesNumber(); + (!firstPageLoaded && pager.getCount() > 0) || // first page not yet loaded and there is data to load + (firstPageLoaded && pager.hasNextPage()); // the first page has been loaded and there is another page return result; } - public K next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -741,14 +755,21 @@ // must load iterator - // increments page index - pager.setPageIndex(pager.getPageIndex() + 1); - PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager); + PaginationParameter pageToLoad; + if (firstPageLoaded) { + pageToLoad = pager.getNextPage(); + } else { + pageToLoad = pager.getCurrentPage(); + firstPageLoaded = true; + } // load new window of data - List<K> values = dao.find(hql, params, pager); + List<K> values = dao.find(hql, params, pageToLoad); data = values.iterator(); + // Create a new pager on the next page + pager = PaginationResult.of(pager.getElements(), pager.getCount(), pageToLoad); + } K next = data.next(); @@ -920,8 +941,8 @@ } @Override - public List<E> find(TopiaPagerBean pager) { - return getNextStep().find(pager); + public List<E> find(PaginationParameter page) { + return getNextStep().find(page); } @Override @@ -945,8 +966,8 @@ } @Override - public List<String> findIds(TopiaPagerBean pager) { - return getNextStep().findIds(pager); + public List<String> findIds(PaginationParameter page) { + return getNextStep().findIds(page); } @Override @@ -1060,8 +1081,8 @@ } @Override - public List<E> find(TopiaPagerBean pager) { - return topiaDAO.find(hql, hqlParameters, pager); + public List<E> find(PaginationParameter page) { + return topiaDAO.find(hql, hqlParameters, page); } @Override @@ -1077,9 +1098,9 @@ } @Override - public List<String> findIds(TopiaPagerBean pager) { + public List<String> findIds(PaginationParameter page) { String hqlWithSelectClause = "select topiaId " + hql; - return topiaDAO.find(hqlWithSelectClause, hqlParameters, pager); + return topiaDAO.find(hqlWithSelectClause, hqlParameters, page); } }