From b70f2e06b47b77bac80953ce968ede938593fe80 Mon Sep 17 00:00:00 2001 From: Anuruddha Premalal Date: Thu, 25 Apr 2013 17:17:33 +0530 Subject: [PATCH] draft implementation of server side pagination for retriveOne --- .../client/api/ClientsApiResource.java | 13 +++++ .../service/ClientReadPlatformService.java | 3 ++ .../ClientReadPlatformServiceImpl.java | 32 ++++++++++++ .../portfolio/pagination/Page.java | 42 +++++++++++++++ .../pagination/PaginationHelper.java | 51 +++++++++++++++++++ 5 files changed, 141 insertions(+) create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/Page.java create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/PaginationHelper.java diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientsApiResource.java index 2727f61b9..c9b7186d0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientsApiResource.java @@ -5,6 +5,7 @@ */ package org.mifosplatform.portfolio.client.api; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -41,6 +42,7 @@ import org.mifosplatform.portfolio.client.data.ClientAccountSummaryCollectionDat import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; import org.mifosplatform.portfolio.group.service.SearchParameters; +import org.mifosplatform.portfolio.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -123,6 +125,17 @@ public class ClientsApiResource { return this.toApiJsonSerializer.serialize(settings, clientData, ClientApiConstants.CLIENT_RESPONSE_DATA_PARAMETERS); } + + @GET + @Path("/paginated") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveOnePaginated(@QueryParam("pageNo") final int pageNo, @QueryParam("pageSize") final int pageSize, + @Context final UriInfo uriInfo) throws SQLException { + context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME); + Page clientData = this.clientReadPlatformService.retrieveOnePaginated(pageNo, pageSize); + return clientData.toString(); + } @POST @Consumes({ MediaType.APPLICATION_JSON }) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformService.java index de2649cbe..76be3a5d0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformService.java @@ -11,12 +11,15 @@ import org.mifosplatform.portfolio.client.data.ClientAccountSummaryCollectionDat import org.mifosplatform.portfolio.client.data.ClientAccountSummaryData; import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.group.service.SearchParameters; +import org.mifosplatform.portfolio.pagination.Page; public interface ClientReadPlatformService { ClientData retrieveTemplate(); Collection retrieveAll(SearchParameters searchParameters); + + Page retrieveOnePaginated(int pageNo, int pageSize); ClientData retrieveOne(Long clientId); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java index 80e0268ea..d6fa6bebf 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java @@ -29,11 +29,14 @@ import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.service.SearchParameters; import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData; import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; +import org.mifosplatform.portfolio.pagination.Page; +import org.mifosplatform.portfolio.pagination.PaginationHelper; import org.mifosplatform.useradministration.domain.AppUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import org.springframework.stereotype.Service; @Service @@ -87,6 +90,35 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService return this.jdbcTemplate.query(sql, clientMapper, new Object[] { hierarchySearchString }); } + @Override + public Page retrieveOnePaginated(final int pageNo, final int pageSize) { + PaginationHelper ph = new PaginationHelper(); + return ph.fetchPage(jdbcTemplate, "SELECT count(*) FROM m_client ORDER BY firstname", "SELECT * FROM m_client ORDER BY firstname", + null, pageNo, pageSize, new ParameterizedRowMapper() { + + @Override + public ClientData mapRow(ResultSet rs, int rowNum) throws SQLException { + final String accountNo = rs.getString("account_no"); + final EnumOptionData status = null; + final Long officeId = JdbcSupport.getLong(rs, "office_id"); + final Long id = JdbcSupport.getLong(rs, "id"); + final String firstname = rs.getString("firstname"); + final String middlename = rs.getString("middlename"); + final String lastname = rs.getString("lastname"); + final String fullname = rs.getString("fullname"); + final String displayName = rs.getString("display_name"); + final String externalId = rs.getString("external_Id"); + final LocalDate activationDate = JdbcSupport.getLocalDate(rs, "activation_date"); + final String imageKey = rs.getString("image_key"); + final String officeName = null; + + return ClientData.instance(accountNo, status, officeId, officeName, id, firstname, middlename, lastname, fullname, + displayName, externalId, activationDate, imageKey); + } + }); + + } + private String buildSqlStringFromClientCriteria(final SearchParameters searchParameters) { final String sqlSearch = searchParameters.getSqlSearch(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/Page.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/Page.java new file mode 100644 index 000000000..27177d6d9 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/Page.java @@ -0,0 +1,42 @@ +package org.mifosplatform.portfolio.pagination; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gson.Gson; + +public class Page { + + private int pageNumber; + private int pagesAvailable; + private List pageItems = new ArrayList(); + + public void setPageNumber(int pageNumber) { + this.pageNumber = pageNumber; + } + + public void setPagesAvailable(int pagesAvailable) { + this.pagesAvailable = pagesAvailable; + } + + public void setPageItems(List pageItems) { + this.pageItems = pageItems; + } + + public int getPageNumber() { + return pageNumber; + } + + public int getPagesAvailable() { + return pagesAvailable; + } + + public List getPageItems() { + return pageItems; + } + + @Override + public String toString() { + return new Gson().toJson(this); + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/PaginationHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/PaginationHelper.java new file mode 100644 index 000000000..2a56a12bc --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/pagination/PaginationHelper.java @@ -0,0 +1,51 @@ +package org.mifosplatform.portfolio.pagination; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.ResultSetExtractor; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; + +public class PaginationHelper { + + public Page fetchPage(final JdbcTemplate jt, final String sqlCountRows, final String sqlFetchRows, final Object args[], + final int pageNo, final int pageSize, final ParameterizedRowMapper rowMapper) { + + // determine how many rows are available + final int rowCount = jt.queryForInt(sqlCountRows, args); + + // calculate the number of pages + int pageCount = rowCount / pageSize; + if (rowCount > pageSize * pageCount) { + pageCount++; + } + + // create the page object + final Page page = new Page(); + page.setPageNumber(pageNo); + page.setPagesAvailable(pageCount); + + // fetch a single page of results + final int startRow = (pageNo - 1) * pageSize; + jt.query(sqlFetchRows, new ResultSetExtractor() { + + @Override + public E extractData(ResultSet rs) throws SQLException, DataAccessException { + final List pageItems = page.getPageItems(); + int currentRow = 0; + while (rs.next() && currentRow < startRow + pageSize) { + if (currentRow >= startRow) { + pageItems.add(rowMapper.mapRow(rs, currentRow)); + } + currentRow++; + } + return (E) page; + } + }); + return page; + } + +} \ No newline at end of file