=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/Query.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/Query.java 2015-02-23 04:59:43 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/Query.java 2015-03-20 03:00:33 +0000 @@ -172,11 +172,11 @@ Optional name = Optional.fromNullable( schema.getProperty( "name" ) ); Optional created = Optional.fromNullable( schema.getProperty( "created" ) ); - if ( name.isPresent() ) + if ( name.isPresent() && name.get().isPersisted() ) { addOrder( Order.asc( name.get() ) ); } - else if ( created.isPresent() ) + else if ( created.isPresent() && created.get().isPersisted() ) { addOrder( Order.desc( created.get() ) ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/QueryEngine.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/QueryEngine.java 2015-02-23 13:06:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/QueryEngine.java 2015-03-20 03:00:33 +0000 @@ -36,4 +36,6 @@ public interface QueryEngine { List query( Query query ); + + int count( Query query ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/QueryService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/QueryService.java 2015-02-20 09:14:02 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/query/QueryService.java 2015-03-20 03:00:33 +0000 @@ -39,5 +39,7 @@ Result query( Query query, ResultTransformer transformer ); + int count( Query query ); + Query getQueryFromUrl( Class klass, List filters, List orders ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/CriteriaQueryEngine.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/CriteriaQueryEngine.java 2015-03-10 12:19:24 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/CriteriaQueryEngine.java 2015-03-20 03:00:33 +0000 @@ -31,6 +31,7 @@ import org.hibernate.Criteria; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Disjunction; +import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.hibernate.HibernateGenericStore; @@ -84,6 +85,40 @@ return criteria.list(); } + @Override + @SuppressWarnings( "unchecked" ) + public int count( Query query ) + { + Schema schema = query.getSchema(); + + // create a copy of this query using only the restrictions + Query countQuery = Query.from( query.getSchema() ); + countQuery.add( query.getRestrictions() ); + + if ( schema == null ) + { + return 0; + } + + HibernateGenericStore store = getStore( (Class) schema.getKlass() ); + + if ( store == null ) + { + return 0; + } + + Criteria criteria = buildCriteria( store.getSharingCriteria(), countQuery ); + + if ( criteria == null ) + { + return 0; + } + + return ((Number) criteria + .setProjection( Projections.countDistinct( "id" ) ) + .uniqueResult()).intValue(); + } + private Criteria buildCriteria( Criteria criteria, Query query ) { Map> restrictions = new HashMap<>(); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/DefaultQueryService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/DefaultQueryService.java 2015-03-12 02:34:53 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/DefaultQueryService.java 2015-03-20 03:00:33 +0000 @@ -74,6 +74,12 @@ } @Override + public int count( Query query ) + { + return queryEngine.count( query ); + } + + @Override public Query getQueryFromUrl( Class klass, List filters, List orders ) { Query query = Query.from( schemaService.getDynamicSchema( klass ) ); === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java 2015-03-12 09:22:48 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java 2015-03-20 03:00:33 +0000 @@ -785,7 +785,7 @@ } else if ( options.hasPaging() && !haveFilters ) { - int count = manager.getCount( getEntityClass() ); + int count = queryService.count( query ); Pager pager = new Pager( options.getPage(), count, options.getPageSize() ); metaData.setPager( pager ); @@ -793,8 +793,6 @@ query.setFirstResult( pager.getOffset() ); query.setMaxResults( pager.getPageSize() ); entityList = (List) queryService.query( query ).getItems(); - - metaData.setPager( new Pager( options.getPage(), entityList.size(), options.getPageSize() ) ); } else {