diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java index 27913e900..3fc6918ae 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/CentersApiResource.java @@ -6,7 +6,6 @@ package org.mifosplatform.portfolio.group.api; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -33,6 +32,7 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer; +import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.portfolio.group.data.CenterData; import org.mifosplatform.portfolio.group.data.GroupAccountSummaryCollectionData; @@ -91,17 +91,18 @@ public class CentersApiResource { @GET @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("officeId") final Long officeId, @QueryParam("externalId") final String externalId, - @QueryParam("name") final String name, @QueryParam("underHierarchy") final String hierarchy) { + public String retrieveAll(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("officeId") final Long officeId, + @QueryParam("externalId") final String externalId, @QueryParam("name") final String name, + @QueryParam("underHierarchy") final String hierarchy, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, + @QueryParam("sortOrder") final String sortOrder) { this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME); - final SearchParameters searchCriteria = SearchParameters.from(sqlSearch, officeId, externalId, name, hierarchy); - final Collection centers = this.centerReadPlatformService.retrieveAll(searchCriteria); - - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.centerApiJsonSerializer.serialize(settings, centers, GroupingTypesApiConstants.CENTER_RESPONSE_DATA_PARAMETERS); + final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, externalId, name, hierarchy, offset, + limit, orderBy, sortOrder); + final Page groups = this.centerReadPlatformService.retrieveAll(searchParameters); + return this.centerApiJsonSerializer.serialize(groups); } @GET diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java index cee718220..1ffd8cc7b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupsApiResource.java @@ -33,6 +33,7 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer; +import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; @@ -106,17 +107,18 @@ public class GroupsApiResource { @GET @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch, + public String retrieveAll(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("officeId") final Long officeId, @QueryParam("externalId") final String externalId, - @QueryParam("name") final String name, @QueryParam("underHierarchy") final String hierarchy) { + @QueryParam("name") final String name, @QueryParam("underHierarchy") final String hierarchy, + @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, + @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.GROUP_RESOURCE_NAME); - final SearchParameters searchCriteria = SearchParameters.from(sqlSearch, officeId, externalId, name, hierarchy); - final Collection groups = this.groupReadPlatformService.retrieveAll(searchCriteria); - - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.groupGeneralApiJsonSerializer.serialize(settings, groups, GroupingTypesApiConstants.GROUP_RESPONSE_DATA_PARAMETERS); + final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, externalId, name, hierarchy, offset, + limit, orderBy, sortOrder); + final Page groups = this.groupReadPlatformService.retrieveAll(searchParameters); + return this.groupGeneralApiJsonSerializer.serialize(groups); } @GET diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java index ac206efd9..8cd9073f1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformService.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.group.service; import java.util.Collection; +import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.group.data.CenterData; import org.mifosplatform.portfolio.group.data.GroupGeneralData; @@ -18,7 +19,7 @@ public interface CenterReadPlatformService { Collection retrieveAllForDropdown(Long officeId); - Collection retrieveAll(SearchParameters searchCriteria); + Page retrieveAll(SearchParameters searchParameters); GroupGeneralData retrieveCenterGroupTemplate(Long centerId); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java index bd68fb0e9..d41b40fca 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/CenterReadPlatformServiceImpl.java @@ -15,6 +15,8 @@ import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.domain.JdbcSupport; +import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.organisation.office.data.OfficeData; @@ -52,6 +54,8 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService // data mappers private final CenterDataMapper centerMapper = new CenterDataMapper(); private final GroupDataMapper groupDataMapper = new GroupDataMapper(); + + private final PaginationHelper paginationHelper = new PaginationHelper(); @Autowired public CenterReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource, @@ -181,25 +185,38 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService } @Override - public Collection retrieveAll(final SearchParameters searchCriteria) { - - this.context.authenticatedUser(); + public Page retrieveAll(final SearchParameters searchParameters) { final AppUser currentUser = context.authenticatedUser(); final String hierarchy = currentUser.getOffice().getHierarchy(); final String hierarchySearchString = hierarchy + "%"; - String sql = "select " + centerMapper.schema() + " where o.hierarchy like ?"; + StringBuilder sqlBuilder = new StringBuilder(200); + sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); + sqlBuilder.append(this.allGroupTypesDataMapper.schema()); + sqlBuilder.append(" where o.hierarchy like ?"); - final String extraCriteria = getCenterExtraCriteria(searchCriteria); + final String extraCriteria = getCenterExtraCriteria(searchParameters); if (StringUtils.isNotBlank(extraCriteria)) { - sql += " and (" + extraCriteria + ")"; + sqlBuilder.append(" and (").append(extraCriteria).append(")"); } - sql += " order by g.hierarchy"; + if (searchParameters.isOrderByRequested()) { + sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()).append(' ').append(searchParameters.getSortOrder()); + } - return this.jdbcTemplate.query(sql, centerMapper, new Object[] { hierarchySearchString }); + if (searchParameters.isLimited()) { + sqlBuilder.append(" limit ").append(searchParameters.getLimit()); + } + + if (searchParameters.isOffset()) { + sqlBuilder.append(" offset ").append(searchParameters.getOffset()); + } + + final String sqlCountRows = "SELECT FOUND_ROWS()"; + return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), + new Object[] { hierarchySearchString }, this.centerMapper); } @Override diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java index 44e39d385..1e232cb3a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformService.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.group.service; import java.util.Collection; +import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.group.data.GroupAccountSummaryCollectionData; import org.mifosplatform.portfolio.group.data.GroupAccountSummaryData; import org.mifosplatform.portfolio.group.data.GroupGeneralData; @@ -15,7 +16,7 @@ public interface GroupReadPlatformService { GroupGeneralData retrieveTemplate(Long officeId, boolean isCenterGroup); - Collection retrieveAll(SearchParameters searchCriteria); + Page retrieveAll(SearchParameters searchParameters); GroupGeneralData retrieveOne(Long groupId); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java index a23746b13..ddeb713bb 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java @@ -14,6 +14,8 @@ import java.util.List; import org.apache.commons.lang.StringUtils; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; import org.mifosplatform.infrastructure.core.domain.JdbcSupport; +import org.mifosplatform.infrastructure.core.service.Page; +import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.organisation.office.data.OfficeData; @@ -48,6 +50,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { private final CenterReadPlatformService centerReadPlatformService; private final AllGroupTypesDataMapper allGroupTypesDataMapper = new AllGroupTypesDataMapper(); + private final PaginationHelper paginationHelper = new PaginationHelper(); @Autowired public GroupReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource, @@ -100,22 +103,38 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { } @Override - public Collection retrieveAll(final SearchParameters searchCriteria) { + public Page retrieveAll(final SearchParameters searchParameters) { final AppUser currentUser = context.authenticatedUser(); final String hierarchy = currentUser.getOffice().getHierarchy(); final String hierarchySearchString = hierarchy + "%"; - String sql = "select " + this.allGroupTypesDataMapper.schema() + " where o.hierarchy like ?"; + StringBuilder sqlBuilder = new StringBuilder(200); + sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); + sqlBuilder.append(this.allGroupTypesDataMapper.schema()); + sqlBuilder.append(" where o.hierarchy like ?"); + + final String extraCriteria = getGroupExtraCriteria(searchParameters); - final String extraCriteria = getGroupExtraCriteria(searchCriteria); if (StringUtils.isNotBlank(extraCriteria)) { - sql += " and (" + extraCriteria + ")"; + sqlBuilder.append(" and (").append(extraCriteria).append(")"); } - sql += " order by g.hierarchy"; + if (searchParameters.isOrderByRequested()) { + sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()).append(' ').append(searchParameters.getSortOrder()); + } - return this.jdbcTemplate.query(sql, this.allGroupTypesDataMapper, new Object[] { hierarchySearchString }); + if (searchParameters.isLimited()) { + sqlBuilder.append(" limit ").append(searchParameters.getLimit()); + } + + if (searchParameters.isOffset()) { + sqlBuilder.append(" offset ").append(searchParameters.getOffset()); + } + + final String sqlCountRows = "SELECT FOUND_ROWS()"; + return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), + new Object[] { hierarchySearchString }, this.allGroupTypesDataMapper); } // 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java index 55662193b..1efdc3362 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/SearchParameters.java @@ -30,14 +30,21 @@ public final class SearchParameters { final String displayName, final String firstname, final String lastname, final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { - Integer maxLimitAllowed = 200; - if (limit != null && limit < maxLimitAllowed && limit > 0) { - maxLimitAllowed = limit; - } - + Integer maxLimitAllowed = getCheckedLimit(200, limit); + return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed, orderBy, sortOrder); } + + public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final String externalId, + final String name, final String hierarchy, final Integer offset, + final Integer limit, final String orderBy, final String sortOrder) { + + Integer maxLimitAllowed = getCheckedLimit(200, limit); + + return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, + orderBy, sortOrder); + } private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit, @@ -62,6 +69,14 @@ public final class SearchParameters { public boolean isSortOrderProvided() { return StringUtils.isNotBlank(this.sortOrder); } + + public static Integer getCheckedLimit(Integer maxLimitAllowed, Integer limit) + { + if (limit != null && limit < maxLimitAllowed && limit > 0) { + maxLimitAllowed = limit; + } + return maxLimitAllowed; + } public String getSqlSearch() { return this.sqlSearch;