MIFOSX-339: use common search parameters for loans and journal entries retrieve all as it contains logic and api for dealing with limits.

This commit is contained in:
Keith Woodlock
2013-05-09 11:30:46 +01:00
parent 2dba94f198
commit 57791b8f37
9 changed files with 94 additions and 79 deletions
@@ -20,9 +20,6 @@ import org.apache.commons.lang.StringUtils;
* Class for parsing dates sent as query parameters * Class for parsing dates sent as query parameters
* *
* TODO: Vishwas Should move this class to a more generic package * TODO: Vishwas Should move this class to a more generic package
*
* @author
*
*/ */
public class DateParam { public class DateParam {
@@ -34,6 +34,7 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.group.service.SearchParameters;
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;
@@ -80,8 +81,6 @@ public class JournalEntriesApiResource {
this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
Page<JournalEntryData> glJournalEntries = null;
Date fromDate = null; Date fromDate = null;
if (fromDateParam != null) { if (fromDateParam != null) {
fromDate = fromDateParam.getDate(); fromDate = fromDateParam.getDate();
@@ -90,11 +89,14 @@ public class JournalEntriesApiResource {
if (toDateParam != null) { if (toDateParam != null) {
toDate = toDateParam.getDate(); toDate = toDateParam.getDate();
} }
glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(officeId, glAccountId, onlyManualEntries, fromDate, toDate,
offset, limit, orderBy, sortOrder, transactionId); final SearchParameters searchParameters = SearchParameters.forJournalEntries(officeId, offset, limit, orderBy, sortOrder);
Page<JournalEntryData> glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(searchParameters, glAccountId,
onlyManualEntries, fromDate, toDate, transactionId);
return this.apiJsonSerializerService.serialize(glJournalEntries); return this.apiJsonSerializerService.serialize(glJournalEntries);
} }
@GET @GET
@Path("{journalEntryId}") @Path("{journalEntryId}")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@@ -9,12 +9,13 @@ import java.util.Date;
import org.mifosplatform.accounting.journalentry.data.JournalEntryData; import org.mifosplatform.accounting.journalentry.data.JournalEntryData;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.portfolio.group.service.SearchParameters;
public interface JournalEntryReadPlatformService { public interface JournalEntryReadPlatformService {
JournalEntryData retrieveGLJournalEntryById(long glJournalEntryId); JournalEntryData retrieveGLJournalEntryById(long glJournalEntryId);
Page<JournalEntryData> retrieveAll(Long officeId, Long glAccountId, Boolean onlyManualEntries, Date fromDate, Date toDate, Page<JournalEntryData> retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate,
Integer offset, Integer limit, String orderBy, String sortOrder, String transactionId); Date toDate, String transactionId);
} }
@@ -23,6 +23,7 @@ import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.PaginationHelper;
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
import org.mifosplatform.portfolio.group.service.SearchParameters;
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;
@@ -33,7 +34,7 @@ import org.springframework.stereotype.Service;
public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlatformService { public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlatformService {
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final GLJournalEntryMapper journalEntryMapper = new GLJournalEntryMapper(); private final GLJournalEntryMapper journalEntryMapper = new GLJournalEntryMapper();
private final PaginationHelper<JournalEntryData> paginationHelper = new PaginationHelper<JournalEntryData>(); private final PaginationHelper<JournalEntryData> paginationHelper = new PaginationHelper<JournalEntryData>();
@@ -89,16 +90,15 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
final Boolean reversed = rs.getBoolean("reversed"); final Boolean reversed = rs.getBoolean("reversed");
final String referenceNumber = rs.getString("referenceNumber"); final String referenceNumber = rs.getString("referenceNumber");
return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType, return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType, transactionDate,
transactionDate, entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate, entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate, createdByUserName,
createdByUserName, comments, reversed, referenceNumber); comments, reversed, referenceNumber);
} }
} }
@Override @Override
public Page<JournalEntryData> retrieveAll(final Long officeId, final Long glAccountId, final Boolean onlyManualEntries, public Page<JournalEntryData> retrieveAll(final SearchParameters searchParameters, final Long glAccountId,
final Date fromDate, final Date toDate, final Integer offset, final Integer limit, final String orderBy, final Boolean onlyManualEntries, final Date fromDate, final Date toDate, final String transactionId) {
final String sortOrder, final String transactionId) {
StringBuilder sqlBuilder = new StringBuilder(200); StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); sqlBuilder.append("select SQL_CALC_FOUND_ROWS ");
@@ -113,9 +113,9 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
arrayPos = arrayPos + 1; arrayPos = arrayPos + 1;
} }
if (officeId != null && officeId != 0) { if (searchParameters.isOfficeIdPassed()) {
sqlBuilder.append(" and journalEntry.office_id = ?"); sqlBuilder.append(" and journalEntry.office_id = ?");
objectArray[arrayPos] = officeId; objectArray[arrayPos] = searchParameters.getOfficeId();
arrayPos = arrayPos + 1; arrayPos = arrayPos + 1;
} }
@@ -156,26 +156,20 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
} }
} }
if (StringUtils.isNotBlank(orderBy)) { if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(orderBy); sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
if (StringUtils.isNotBlank(sortOrder)) {
sqlBuilder.append(' ').append(sortOrder); if (searchParameters.isSortOrderProvided()) {
sqlBuilder.append(' ').append(searchParameters.getSortOrder());
} }
} }
if (limit != null && limit > 0) { if (searchParameters.isLimited()) {
Integer maxLimitAllowed = 200; sqlBuilder.append(" limit ").append(searchParameters.getLimit());
if (limit < maxLimitAllowed) { if (searchParameters.isOffset()) {
maxLimitAllowed = limit; sqlBuilder.append(" offset ").append(searchParameters.getOffset());
} }
sqlBuilder.append(" limit ").append(maxLimitAllowed); }
if (offset != null) {
sqlBuilder.append(" offset ").append(offset);
}
} else if (limit != null && limit == -1) {
;
} else
sqlBuilder.append(" limit ").append(200);
final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos); final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos);
final String sqlCountRows = "SELECT FOUND_ROWS()"; final String sqlCountRows = "SELECT FOUND_ROWS()";
@@ -90,9 +90,6 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
sqlBuilder.append(" and (").append(extraCriteria).append(")"); sqlBuilder.append(" and (").append(extraCriteria).append(")");
} }
// DONT order by default - just use database natural ordering so doesnt
// have to scan entire database table.
// sql += " order by c.display_name ASC, c.account_no ASC";
if (searchParameters.isOrderByRequested()) { if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()); sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
@@ -30,20 +30,35 @@ public final class SearchParameters {
final String displayName, final String firstname, final String lastname, final String hierarchy, final Integer offset, final String displayName, final String firstname, final String lastname, final String hierarchy, final Integer offset,
final Integer limit, final String orderBy, final String sortOrder) { final Integer limit, final String orderBy, final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(200, limit); Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed, return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed,
orderBy, sortOrder); 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); 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) {
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, Integer maxLimitAllowed = getCheckedLimit(limit);
orderBy, sortOrder);
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, orderBy,
sortOrder);
}
public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder);
}
public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder) {
Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder);
} }
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
@@ -69,14 +84,25 @@ public final class SearchParameters {
public boolean isSortOrderProvided() { public boolean isSortOrderProvided() {
return StringUtils.isNotBlank(this.sortOrder); return StringUtils.isNotBlank(this.sortOrder);
} }
public static Integer getCheckedLimit(Integer maxLimitAllowed, Integer limit) { public static Integer getCheckedLimit(final Integer limit) {
if (limit != null && limit < maxLimitAllowed && limit > 0) {
return limit; final Integer maxLimitAllowed = 200;
} else if (limit != null && limit == -1) { // default to max limit first off
return null; Integer checkedLimit = maxLimitAllowed;
} else
return maxLimitAllowed; if (limit != null && limit > 0) {
checkedLimit = limit;
} else if (limit != null) {
// unlimited case: limit provided and 0 or less
checkedLimit = null;
}
return checkedLimit;
}
public boolean isOfficeIdPassed() {
return this.officeId != null && this.officeId != 0;
} }
public String getSqlSearch() { public String getSqlSearch() {
@@ -54,6 +54,7 @@ import org.mifosplatform.portfolio.fund.data.FundData;
import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; import org.mifosplatform.portfolio.fund.service.FundReadPlatformService;
import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.data.GroupGeneralData;
import org.mifosplatform.portfolio.group.service.GroupReadPlatformService; import org.mifosplatform.portfolio.group.service.GroupReadPlatformService;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData;
import org.mifosplatform.portfolio.loanaccount.data.LoanChargeData; import org.mifosplatform.portfolio.loanaccount.data.LoanChargeData;
import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData;
@@ -367,8 +368,10 @@ public class LoansApiResource {
@QueryParam("sortOrder") final String sortOrder) { @QueryParam("sortOrder") final String sortOrder) {
context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions);
final Page<LoanAccountData> loanBasicDetails = this.loanReadPlatformService.retrieveAll(sqlSearch, externalId, offset, limit,
orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder);
final Page<LoanAccountData> loanBasicDetails = this.loanReadPlatformService.retrieveAll(searchParameters);
return this.toApiJsonSerializer.serialize(loanBasicDetails); return this.toApiJsonSerializer.serialize(loanBasicDetails);
} }
@@ -9,6 +9,7 @@ import java.util.Collection;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.portfolio.calendar.data.CalendarData; import org.mifosplatform.portfolio.calendar.data.CalendarData;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData;
import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionData;
import org.mifosplatform.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData; import org.mifosplatform.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData;
@@ -48,5 +49,5 @@ public interface LoanReadPlatformService {
Collection<CalendarData> retrieveCalendars(Long groupId); Collection<CalendarData> retrieveCalendars(Long groupId);
Page<LoanAccountData> retrieveAll(String sqlSearch, String externalId, Integer offset, Integer limit, String orderBy, String sortOrder); Page<LoanAccountData> retrieveAll(SearchParameters searchParameters);
} }
@@ -42,6 +42,7 @@ import org.mifosplatform.portfolio.fund.data.FundData;
import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; import org.mifosplatform.portfolio.fund.service.FundReadPlatformService;
import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.data.GroupGeneralData;
import org.mifosplatform.portfolio.group.service.GroupReadPlatformService; import org.mifosplatform.portfolio.group.service.GroupReadPlatformService;
import org.mifosplatform.portfolio.group.service.SearchParameters;
import org.mifosplatform.portfolio.loanaccount.data.DisbursementData; import org.mifosplatform.portfolio.loanaccount.data.DisbursementData;
import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData; import org.mifosplatform.portfolio.loanaccount.data.LoanAccountData;
import org.mifosplatform.portfolio.loanaccount.data.LoanApplicationTimelineData; import org.mifosplatform.portfolio.loanaccount.data.LoanApplicationTimelineData;
@@ -173,8 +174,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
} }
@Override @Override
public Page<LoanAccountData> retrieveAll(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, public Page<LoanAccountData> retrieveAll(final SearchParameters searchParameters) {
final String orderBy, final String sortOrder) {
StringBuilder sqlBuilder = new StringBuilder(200); StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); sqlBuilder.append("select SQL_CALC_FOUND_ROWS ");
@@ -183,38 +183,32 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
final Object[] objectArray = new Object[1]; final Object[] objectArray = new Object[1];
int arrayPos = 0; int arrayPos = 0;
String sqlQueryCriteria = sqlSearch; String sqlQueryCriteria = searchParameters.getSqlSearch();
if (StringUtils.isNotBlank(sqlQueryCriteria)) { if (StringUtils.isNotBlank(sqlQueryCriteria)) {
sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "l.account_no"); sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "l.account_no");
sqlBuilder.append(" where (").append(sqlQueryCriteria).append(")"); sqlBuilder.append(" where (").append(sqlQueryCriteria).append(")");
} }
if (StringUtils.isNotBlank(externalId)) { if (StringUtils.isNotBlank(searchParameters.getExternalId())) {
sqlBuilder.append(" and l.external_id = ?"); sqlBuilder.append(" and l.external_id = ?");
objectArray[arrayPos] = externalId; objectArray[arrayPos] = searchParameters.getExternalId();
arrayPos = arrayPos + 1; arrayPos = arrayPos + 1;
} }
if (StringUtils.isNotBlank(orderBy)) { if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(orderBy); sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
if (StringUtils.isNotBlank(sortOrder)) {
sqlBuilder.append(' ').append(sortOrder); if (searchParameters.isSortOrderProvided()) {
sqlBuilder.append(' ').append(searchParameters.getSortOrder());
} }
} }
if (limit != null && limit > 0) { if (searchParameters.isLimited()) {
Integer maxLimitAllowed = 200; sqlBuilder.append(" limit ").append(searchParameters.getLimit());
if (limit < maxLimitAllowed) { if (searchParameters.isOffset()) {
maxLimitAllowed = limit; sqlBuilder.append(" offset ").append(searchParameters.getOffset());
} }
sqlBuilder.append(" limit ").append(maxLimitAllowed); }
if (offset != null) {
sqlBuilder.append(" offset ").append(offset);
}
} else if (limit != null && limit == -1) {
;
} else
sqlBuilder.append(" limit ").append(200);
final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos); final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos);
final String sqlCountRows = "SELECT FOUND_ROWS()"; final String sqlCountRows = "SELECT FOUND_ROWS()";