draft implementation of server side pagination for retriveOne
This commit is contained in:
+13
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.client.api;
|
package org.mifosplatform.portfolio.client.api;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
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.data.ClientData;
|
||||||
import org.mifosplatform.portfolio.client.service.ClientReadPlatformService;
|
import org.mifosplatform.portfolio.client.service.ClientReadPlatformService;
|
||||||
import org.mifosplatform.portfolio.group.service.SearchParameters;
|
import org.mifosplatform.portfolio.group.service.SearchParameters;
|
||||||
|
import org.mifosplatform.portfolio.pagination.Page;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -124,6 +126,17 @@ public class ClientsApiResource {
|
|||||||
return this.toApiJsonSerializer.serialize(settings, clientData, ClientApiConstants.CLIENT_RESPONSE_DATA_PARAMETERS);
|
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> clientData = this.clientReadPlatformService.retrieveOnePaginated(pageNo, pageSize);
|
||||||
|
return clientData.toString();
|
||||||
|
}
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes({ MediaType.APPLICATION_JSON })
|
@Consumes({ MediaType.APPLICATION_JSON })
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON })
|
||||||
|
|||||||
+3
@@ -11,6 +11,7 @@ import org.mifosplatform.portfolio.client.data.ClientAccountSummaryCollectionDat
|
|||||||
import org.mifosplatform.portfolio.client.data.ClientAccountSummaryData;
|
import org.mifosplatform.portfolio.client.data.ClientAccountSummaryData;
|
||||||
import org.mifosplatform.portfolio.client.data.ClientData;
|
import org.mifosplatform.portfolio.client.data.ClientData;
|
||||||
import org.mifosplatform.portfolio.group.service.SearchParameters;
|
import org.mifosplatform.portfolio.group.service.SearchParameters;
|
||||||
|
import org.mifosplatform.portfolio.pagination.Page;
|
||||||
|
|
||||||
public interface ClientReadPlatformService {
|
public interface ClientReadPlatformService {
|
||||||
|
|
||||||
@@ -18,6 +19,8 @@ public interface ClientReadPlatformService {
|
|||||||
|
|
||||||
Collection<ClientData> retrieveAll(SearchParameters searchParameters);
|
Collection<ClientData> retrieveAll(SearchParameters searchParameters);
|
||||||
|
|
||||||
|
Page<ClientData> retrieveOnePaginated(int pageNo, int pageSize);
|
||||||
|
|
||||||
ClientData retrieveOne(Long clientId);
|
ClientData retrieveOne(Long clientId);
|
||||||
|
|
||||||
Collection<ClientData> retrieveAllForLookup(String extraCriteria);
|
Collection<ClientData> retrieveAllForLookup(String extraCriteria);
|
||||||
|
|||||||
+32
@@ -29,11 +29,14 @@ import org.mifosplatform.portfolio.group.data.GroupGeneralData;
|
|||||||
import org.mifosplatform.portfolio.group.service.SearchParameters;
|
import org.mifosplatform.portfolio.group.service.SearchParameters;
|
||||||
import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData;
|
import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData;
|
||||||
import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations;
|
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.mifosplatform.useradministration.domain.AppUser;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.dao.EmptyResultDataAccessException;
|
import org.springframework.dao.EmptyResultDataAccessException;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.jdbc.core.RowMapper;
|
import org.springframework.jdbc.core.RowMapper;
|
||||||
|
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -87,6 +90,35 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
|
|||||||
return this.jdbcTemplate.query(sql, clientMapper, new Object[] { hierarchySearchString });
|
return this.jdbcTemplate.query(sql, clientMapper, new Object[] { hierarchySearchString });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<ClientData> retrieveOnePaginated(final int pageNo, final int pageSize) {
|
||||||
|
PaginationHelper<ClientData> ph = new PaginationHelper<ClientData>();
|
||||||
|
return ph.fetchPage(jdbcTemplate, "SELECT count(*) FROM m_client ORDER BY firstname", "SELECT * FROM m_client ORDER BY firstname",
|
||||||
|
null, pageNo, pageSize, new ParameterizedRowMapper<ClientData>() {
|
||||||
|
|
||||||
|
@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) {
|
private String buildSqlStringFromClientCriteria(final SearchParameters searchParameters) {
|
||||||
|
|
||||||
final String sqlSearch = searchParameters.getSqlSearch();
|
final String sqlSearch = searchParameters.getSqlSearch();
|
||||||
|
|||||||
@@ -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<E> {
|
||||||
|
|
||||||
|
private int pageNumber;
|
||||||
|
private int pagesAvailable;
|
||||||
|
private List<E> pageItems = new ArrayList<E>();
|
||||||
|
|
||||||
|
public void setPageNumber(int pageNumber) {
|
||||||
|
this.pageNumber = pageNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPagesAvailable(int pagesAvailable) {
|
||||||
|
this.pagesAvailable = pagesAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPageItems(List<E> pageItems) {
|
||||||
|
this.pageItems = pageItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPageNumber() {
|
||||||
|
return pageNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPagesAvailable() {
|
||||||
|
return pagesAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<E> getPageItems() {
|
||||||
|
return pageItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return new Gson().toJson(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
+51
@@ -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<E> {
|
||||||
|
|
||||||
|
public Page<E> fetchPage(final JdbcTemplate jt, final String sqlCountRows, final String sqlFetchRows, final Object args[],
|
||||||
|
final int pageNo, final int pageSize, final ParameterizedRowMapper<E> 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<E> page = new Page<E>();
|
||||||
|
page.setPageNumber(pageNo);
|
||||||
|
page.setPagesAvailable(pageCount);
|
||||||
|
|
||||||
|
// fetch a single page of results
|
||||||
|
final int startRow = (pageNo - 1) * pageSize;
|
||||||
|
jt.query(sqlFetchRows, new ResultSetExtractor<E>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E extractData(ResultSet rs) throws SQLException, DataAccessException {
|
||||||
|
final List<E> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user