Implemented back-end methods for pagination and sorting

MIFOSX-322, MIFOSX-323
This commit is contained in:
Anuruddha Premalal
2013-05-04 07:52:13 +05:30
parent d5ef1033c3
commit 17cc35d27a
7 changed files with 93 additions and 37 deletions
@@ -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<CenterData> 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<CenterData> groups = this.centerReadPlatformService.retrieveAll(searchParameters);
return this.centerApiJsonSerializer.serialize(groups);
}
@GET
@@ -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<GroupGeneralData> 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<GroupGeneralData> groups = this.groupReadPlatformService.retrieveAll(searchParameters);
return this.groupGeneralApiJsonSerializer.serialize(groups);
}
@GET
@@ -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<CenterData> retrieveAllForDropdown(Long officeId);
Collection<CenterData> retrieveAll(SearchParameters searchCriteria);
Page<CenterData> retrieveAll(SearchParameters searchParameters);
GroupGeneralData retrieveCenterGroupTemplate(Long centerId);
@@ -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<CenterData> paginationHelper = new PaginationHelper<CenterData>();
@Autowired
public CenterReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource,
@@ -181,25 +185,38 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService
}
@Override
public Collection<CenterData> retrieveAll(final SearchParameters searchCriteria) {
this.context.authenticatedUser();
public Page<CenterData> 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
@@ -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<GroupGeneralData> retrieveAll(SearchParameters searchCriteria);
Page<GroupGeneralData> retrieveAll(SearchParameters searchParameters);
GroupGeneralData retrieveOne(Long groupId);
@@ -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<GroupGeneralData> paginationHelper = new PaginationHelper<GroupGeneralData>();
@Autowired
public GroupReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource,
@@ -100,22 +103,38 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
}
@Override
public Collection<GroupGeneralData> retrieveAll(final SearchParameters searchCriteria) {
public Page<GroupGeneralData> 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
@@ -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;