Author: tchemit Date: 2013-12-18 17:22:42 +0100 (Wed, 18 Dec 2013) New Revision: 2933 Url: http://nuiton.org/projects/topia/repository/revisions/2933 Log: fixes #2971: Add some methods to use pager in TopiaDao and query builder fixes some generics issues on query builder Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderRunQueryStep.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java 2013-12-18 16:21:54 UTC (rev 2932) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java 2013-12-18 16:22:42 UTC (rev 2933) @@ -80,6 +80,7 @@ * @param <E> the managed entity type * @author bpoussin <poussin@codelutin.com> * @author Arnaud Thimel <thimel@codelutin.com> + * @author Tony CHEMIT <chemit@codelutin.com> */ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDao<E> { @@ -144,6 +145,10 @@ this.batchSize = batchSize; } + protected String newFromClause() { + return newFromClause(null); + } + protected String newFromClause(String alias) { String hql = "from " + getTopiaEntityEnum().getImplementationFQN(); if (StringUtils.isNotBlank(alias)) { @@ -165,15 +170,32 @@ } catch (InstantiationException e) { throw new TopiaException( "Impossible de trouver ou d'instancier la classe " - + implementation); + + implementation); } catch (IllegalAccessException e) { throw new TopiaException( "Impossible de trouver ou d'instancier la classe " - + implementation); + + implementation); } } @Override + public TopiaPagerBean newPager(int pageSize) { + TopiaPagerBean pager = newPager(newFromClause(), null, pageSize); + return pager; + } + + @Override + public TopiaPagerBean newPager(String hql, Map<String, Object> params, int pageSize) { + TopiaPagerBean pager = new TopiaPagerBean(); + + long count = count("SELECT COUNT(*) " + hql, params); + pager.setRecords(count); + pager.setPageSize(pageSize); + PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager); + return pager; + } + + @Override public void addTopiaEntityListener(TopiaEntityListener listener) { topiaListenableSupport.addTopiaEntityListener(getEntityClass(), listener); } @@ -328,7 +350,7 @@ } protected TopiaQueryBuilderRunQueryStep<E> forHql(String hql, Map<String, Object> hqlParameters) { - TopiaQueryBuilderRunQueryStep result = new TopiaQueryBuilderRunQueryStep(this, hql, hqlParameters); + TopiaQueryBuilderRunQueryStep<E> result = new TopiaQueryBuilderRunQueryStep<E>(this, hql, hqlParameters); return result; } @@ -344,7 +366,7 @@ @Override public TopiaQueryBuilderAddCriteriaStep<E> forProperties(Map<String, Object> properties) { HqlAndParametersBuilder<E> hqlAndParametersBuilder = getHqlForProperties(properties); - TopiaQueryBuilderAddCriteriaStep result = new TopiaQueryBuilderAddCriteriaStep(this, hqlAndParametersBuilder); + TopiaQueryBuilderAddCriteriaStep<E> result = new TopiaQueryBuilderAddCriteriaStep<E>(this, hqlAndParametersBuilder); return result; } @@ -353,14 +375,14 @@ Object propertyValue, Object... otherPropertyNamesAndValues) { HqlAndParametersBuilder<E> hqlAndParametersBuilder = getHqlForProperties(propertyName, propertyValue, otherPropertyNamesAndValues); - TopiaQueryBuilderAddCriteriaStep result = new TopiaQueryBuilderAddCriteriaStep(this, hqlAndParametersBuilder); + TopiaQueryBuilderAddCriteriaStep<E> result = new TopiaQueryBuilderAddCriteriaStep<E>(this, hqlAndParametersBuilder); return result; } @Override public TopiaQueryBuilderAddCriteriaStep<E> newQueryBuilder() { HqlAndParametersBuilder<E> hqlAndParametersBuilder = newHqlAndParametersBuilder(); - TopiaQueryBuilderAddCriteriaStep result = new TopiaQueryBuilderAddCriteriaStep(this, hqlAndParametersBuilder); + TopiaQueryBuilderAddCriteriaStep<E> result = new TopiaQueryBuilderAddCriteriaStep<E>(this, hqlAndParametersBuilder); return result; } @@ -377,7 +399,7 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> forIn(String propertyName, Iterable<Object> propertyValues) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> forIn(String propertyName, Iterable<?> propertyValues) { TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> result = newQueryBuilder().addIn(propertyName, propertyValues); return result; } @@ -434,7 +456,7 @@ } protected <K> K findFirstOrNull(String hql, Map<String, Object> hqlParameters) throws QueryMissingOrderException { - if ( ! hql.toLowerCase().contains("order by")) { + if (!hqlContainsOrderBy(hql)) { throw new QueryMissingOrderException(hql, hqlParameters); } K result = findAnyOrNull(hql, hqlParameters); @@ -482,6 +504,9 @@ Preconditions.checkNotNull(hqlParameters); Preconditions.checkNotNull(pager); + boolean orderByClausePresent = hqlContainsOrderBy(hql); + Preconditions.checkState(!orderByClausePresent, "An 'order by' clause was already found in hql, can't use the order of the pager"); + if (StringUtils.isNotBlank(pager.getSortColumn())) { hql += " order by " + pager.getSortColumn(); if (!pager.isSortAscendant()) { @@ -504,9 +529,9 @@ Preconditions.checkNotNull(hqlParameters); final Iterator<K> iterator = new FindAllIterator<E, K>(this, - batchSize, - hql, - hqlParameters); + batchSize, + hql, + hqlParameters); Iterable<K> result = new Iterable<K>() { @Override @@ -577,6 +602,14 @@ return result; } + protected boolean hqlContainsOrderBy(String hql) { + return hql.toLowerCase().contains("order by"); + } + + protected boolean hqlContainsCount(String hql) { + return hql.toLowerCase().contains("count("); + } + // /** // * package locale method because this is hibernate specific method and // * we don't want expose it. @@ -599,47 +632,38 @@ protected final AbstractTopiaDao<E> dao; - protected final String hql; protected final Map<String, Object> params; - protected TopiaPagerBean pager; + protected final TopiaPagerBean pager; public FindAllIterator(AbstractTopiaDao<E> dao, int batchSize, String hql, Map<String, Object> params) { - this.dao = dao; - this.hql = hql; - this.params = params; - String hql2 = hql.toLowerCase(); - int i = hql2.indexOf("order by"); - if (i == -1) { + if (!dao.hqlContainsOrderBy(hql)) { throw new QueryMissingOrderException(hql, params); } - // get the count (removing the order-by) - long count2 = dao.count("SELECT COUNT(*) " + - hql.substring(0, i), params); - pager = new TopiaPagerBean(); - pager.setRecords(count2); - pager.setPageSize(batchSize); - PagerBeanUtil.computeRecordIndexesAndPagesNumber(pager); + this.dao = dao; + this.hql = hql; + this.params = params; + pager = dao.newPager(hql, params, batchSize); // empty iterator (will be changed at first next call) data = Iterators.emptyIterator(); } - + public boolean hasNext() { boolean result = data.hasNext() || // no more data - pager.getPageIndex() < pager.getPagesNumber(); + pager.getPageIndex() < pager.getPagesNumber(); return result; } - + public K next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -663,7 +687,7 @@ return next; } - + public void remove() { throw new UnsupportedOperationException( "This iterator does not support remove operation."); @@ -676,8 +700,6 @@ protected HqlAndParametersBuilder<E> hqlAndParametersBuilder; - protected boolean hasOrderByClause = false; - protected TopiaQueryBuilderAddCriteriaStep(AbstractTopiaDao<E> topiaDAO, HqlAndParametersBuilder<E> hqlAndParametersBuilder) { this.topiaDAO = topiaDAO; this.hqlAndParametersBuilder = hqlAndParametersBuilder; @@ -685,7 +707,6 @@ @Override public TopiaQueryBuilderRunQueryStep<E> setOrderByArguments(Set<String> orderByArguments) { - hasOrderByClause = ! Iterables.isEmpty(orderByArguments); hqlAndParametersBuilder.setOrderByArguments(orderByArguments); return getNextStep(); } @@ -709,13 +730,13 @@ } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<Object> values) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<?> values) { hqlAndParametersBuilder.addIn(property, values); return this; } @Override - public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<Object> values) { + public TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<?> values) { hqlAndParametersBuilder.addNotIn(property, values); return this; } @@ -819,6 +840,11 @@ } @Override + public List<E> find(TopiaPagerBean pager) { + return getNextStep().find(pager); + } + + @Override public Iterable<E> findAllLazy() { return getNextStep().findAllLazy(); } @@ -834,6 +860,11 @@ } @Override + public List<String> findIds(TopiaPagerBean pager) { + return getNextStep().findIds(pager); + } + + @Override public List<String> findAllIds() { return getNextStep().findAllIds(); } @@ -841,7 +872,7 @@ protected TopiaQueryBuilderRunQueryStep<E> getNextStep() { String hql = hqlAndParametersBuilder.getHql(); Map<String, Object> hqlParameters = hqlAndParametersBuilder.getHqlParameters(); - TopiaQueryBuilderRunQueryStep nextStep = new TopiaQueryBuilderRunQueryStep(topiaDAO, hql, hqlParameters); + TopiaQueryBuilderRunQueryStep<E> nextStep = new TopiaQueryBuilderRunQueryStep<E>(topiaDAO, hql, hqlParameters); return nextStep; } @@ -853,7 +884,7 @@ protected final Map<String, Object> hqlParameters; - protected AbstractTopiaDao<E> topiaDAO; + protected final AbstractTopiaDao<E> topiaDAO; protected TopiaQueryBuilderRunQueryStep(AbstractTopiaDao<E> topiaDAO, String hql, Map<String, Object> hqlParameters) { this.hql = hql; @@ -933,6 +964,11 @@ } @Override + public List<E> find(TopiaPagerBean pager) { + return topiaDAO.find(hql, hqlParameters, pager); + } + + @Override public List<String> findAllIds() { String hqlWithSelectClause = "select topiaId " + hql; return topiaDAO.findAll(hqlWithSelectClause, hqlParameters); @@ -944,6 +980,11 @@ return topiaDAO.find(hqlWithSelectClause, hqlParameters, startIndex, endIndex); } + @Override + public List<String> findIds(TopiaPagerBean pager) { + String hqlWithSelectClause = "select topiaId " + hql; + return topiaDAO.find(hqlWithSelectClause, hqlParameters, pager); + } } } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-12-18 16:21:54 UTC (rev 2932) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HqlAndParametersBuilder.java 2013-12-18 16:22:42 UTC (rev 2933) @@ -120,11 +120,11 @@ } } - public void addIn(String property, Iterable<Object> values) { + public void addIn(String property, Iterable<?> values) { addInOrNotIn(property, values, true); } - public void addNotIn(String property, Iterable<Object> values) { + public void addNotIn(String property, Iterable<?> values) { addInOrNotIn(property, values, false); } @@ -132,7 +132,7 @@ * @param in true if property value must be in given collection, false if value * must not be in given collection */ - protected void addInOrNotIn(String property, Iterable<Object> values, boolean in) { + protected void addInOrNotIn(String property, Iterable<?> values, boolean in) { Preconditions.checkNotNull(property); Preconditions.checkNotNull(values); // TODO brendan 02/10/13 if value is intanceof TopiaEntity, we can check type 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 2013-12-18 16:21:54 UTC (rev 2932) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaDao.java 2013-12-18 16:22:42 UTC (rev 2933) @@ -28,6 +28,7 @@ import org.nuiton.topia.TopiaNoResultException; import org.nuiton.topia.event.TopiaEntityListener; import org.nuiton.topia.event.TopiaEntityVetoable; +import org.nuiton.topia.persistence.pager.TopiaPagerBean; import java.util.List; import java.util.Map; @@ -74,6 +75,33 @@ E newInstance(); /** + * Creates a new pager initialized for the first page of all data of the dao. + * + * <strong>Note:</strong> This method will execute a count query to init + * the pager. + * + * @param pageSize size of a page + * @return the initialized pager. + * @since 3.0 + */ + TopiaPagerBean newPager(int pageSize); + + /** + * Creates a new pager initialized for the first page of data of the given + * query. + * + * <strong>Note:</strong> This method will execute a count query to init + * the pager. + * + * @param hql query + * @param params params of the query + * @param pageSize size of a page + * @return the initialized pager. + * @since 3.0 + */ + TopiaPagerBean newPager(String hql, Map<String, Object> params, int pageSize); + + /** * Creates an entity not created without the DAO using any of the others * create methods. The instance may have been created elsewhere. * @@ -195,7 +223,7 @@ /** * @since 3.0 */ - TopiaQueryBuilderRunQueryStep<E> forIn(String propertyName, Iterable<Object> propertyValues); + TopiaQueryBuilderRunQueryStep<E> forIn(String propertyName, Iterable<?> propertyValues); /** * @since 3.0 Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java 2013-12-18 16:21:54 UTC (rev 2932) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderAddCriteriaStep.java 2013-12-18 16:22:42 UTC (rev 2933) @@ -56,14 +56,14 @@ * a one-to-one or a many-to-one property * @param values the value the field of the entity must be equals to one of the given values */ - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<Object> values); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addIn(String property, Iterable<?> values); /** * @param property the name of a field of the queried entity, must be * a one-to-one or a many-to-one property * @param values the value the field of the entity must not be equals to any of the given values */ - TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<Object> values); + TopiaQueryBuilderAddCriteriaOrRunQueryStep<E> addNotIn(String property, Iterable<?> values); /** * @param property the name of a field of the queried entity, must be 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 2013-12-18 16:21:54 UTC (rev 2932) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaQueryBuilderRunQueryStep.java 2013-12-18 16:22:42 UTC (rev 2933) @@ -28,6 +28,7 @@ import org.nuiton.topia.QueryMissingOrderException; import org.nuiton.topia.TopiaNoResultException; import org.nuiton.topia.TopiaNonUniqueResultException; +import org.nuiton.topia.persistence.pager.TopiaPagerBean; import java.util.List; @@ -120,8 +121,12 @@ List<E> find(int startIndex, int endIndex); + List<E> find(TopiaPagerBean pager); + List<String> findAllIds(); List<String> findIds(int startIndex, int endIndex); + List<String> findIds(TopiaPagerBean pager); + }
participants (1)
-
tchemit@users.nuiton.org