From e15459c659148565f0a3d38363ba62dcd0bb5616 Mon Sep 17 00:00:00 2001 From: Jose Alberto Hernandez Date: Sat, 23 Jul 2022 22:40:24 -0500 Subject: [PATCH] Datatables datetime fields management --- .../dataqueries/data/ResultsetRowData.java | 8 ++-- .../service/GenericDataServiceImpl.java | 41 ++++++++----------- .../service/ReadReportingServiceImpl.java | 8 ++-- .../ReadWriteNonCoreDataServiceImpl.java | 30 +++++++++----- .../parts/0019_refactor_loan_transaction.xml | 4 +- 5 files changed, 46 insertions(+), 45 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java index d60252a1d..d000f15e2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java @@ -22,17 +22,17 @@ import java.util.List; public final class ResultsetRowData { - private final List row; + private final List row; - public static ResultsetRowData create(final List rowValues) { + public static ResultsetRowData create(final List rowValues) { return new ResultsetRowData(rowValues); } - private ResultsetRowData(final List rowValues) { + private ResultsetRowData(final List rowValues) { this.row = rowValues; } - public List getRow() { + public List getRow() { return this.row; } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java index 8ea83c115..597bca73c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java @@ -18,15 +18,17 @@ */ package org.apache.fineract.infrastructure.dataqueries.service; +import static java.lang.String.format; + +import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.temporal.ChronoField; import java.util.ArrayList; +import java.util.Date; import java.util.List; import javax.sql.DataSource; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.RoutingDataSource; import org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; @@ -77,7 +79,7 @@ public class GenericDataServiceImpl implements GenericDataService { } while (rs.next()) { - final List columnValues = new ArrayList<>(); + final List columnValues = new ArrayList<>(); for (int i = 0; i < rsmd.getColumnCount(); i++) { final String columnName = rsmd.getColumnName(i + 1); final String columnValue = rs.getString(columnName); @@ -134,12 +136,12 @@ public class GenericDataServiceImpl implements GenericDataService { final List columnHeaders = grs.getColumnHeaders(); final List data = grs.getData(); - List row; + List row; Integer rSize; final String doubleQuote = "\""; final String slashDoubleQuote = "\\\""; String currColType; - String currVal; + Object currVal; for (int i = 0; i < data.size(); i++) { writer.append("\n{"); @@ -160,23 +162,24 @@ public class GenericDataServiceImpl implements GenericDataService { if (currColType == null && colType.equalsIgnoreCase("DATE")) { currColType = "DATE"; } + if (currColType == null && colType.equalsIgnoreCase("DATETIME")) { + currColType = "DATETIME"; + } currVal = row.get(j); if (currVal != null && currColType != null) { if (currColType.equals("DECIMAL") || currColType.equals("INTEGER")) { writer.append(currVal); } else { if (currColType.equals("DATE")) { - final LocalDate localDate = LocalDate.parse(currVal); - writer.append( - "[" + localDate.getYear() + ", " + localDate.getMonthValue() + ", " + localDate.getDayOfMonth() + "]"); + final LocalDate localDate = new java.sql.Date(((Date) currVal).getTime()).toLocalDate(); + writer.append(format("[%d,%d,%d]", localDate.getYear(), localDate.getMonthValue(), localDate.getDayOfMonth())); } else if (currColType.equals("DATETIME")) { - final LocalDateTime localDateTime = LocalDateTime.parse(formatDateTimeValue(currVal), - DateUtils.DEFAULT_DATETIME_FORMATTER); - writer.append("[" + localDateTime.getYear() + ", " + localDateTime.getMonthValue() + ", " - + localDateTime.getDayOfMonth() + ", " + localDateTime.getHour() + ", " + localDateTime.getMinute() - + ", " + localDateTime.getSecond() + ", " + localDateTime.get(ChronoField.MILLI_OF_SECOND) + "]"); + final LocalDateTime ldt = currVal instanceof Timestamp ? ((Timestamp) currVal).toLocalDateTime() + : (LocalDateTime) currVal; + writer.append(format("[%d,%d,%d,%d,%d,%d,%d]", ldt.getYear(), ldt.getMonthValue(), ldt.getDayOfMonth(), + ldt.getHour(), ldt.getMinute(), ldt.getSecond(), ldt.getNano())); } else { - writer.append(doubleQuote + replace(currVal, doubleQuote, slashDoubleQuote) + doubleQuote); + writer.append(doubleQuote + replace((String) currVal, doubleQuote, slashDoubleQuote) + doubleQuote); } } } else { @@ -264,14 +267,4 @@ public class GenericDataServiceImpl implements GenericDataService { throw new DatatableNotFoundException(datatable); } } - - private String formatDateTimeValue(String dateTimeValue) { - if (dateTimeValue.length() > 19) { - dateTimeValue = dateTimeValue.substring(0, 19); - } - if (dateTimeValue.contains("T")) { - dateTimeValue = dateTimeValue.replace("T", " "); - } - return dateTimeValue; - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java index 8f9ca8b80..aa07c9c63 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java @@ -115,7 +115,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { writer.append('\n'); final List data = result.getData(); - List row; + List row; Integer rSize; // String currCol; String currColType; @@ -129,7 +129,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { for (int j = 0; j < rSize; j++) { // currCol = columnHeaders.get(j).getColumnName(); currColType = columnHeaders.get(j).getColumnType(); - currVal = row.get(j); + currVal = (String) row.get(j); if (currVal != null) { if (currColType.equals("DECIMAL") || currColType.equals("DOUBLE") || currColType.equals("BIGINT") || currColType.equals("SMALLINT") || currColType.equals("INT")) { @@ -252,7 +252,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { final List columnHeaders = result.getColumnHeaders(); final List data = result.getData(); - List row; + List row; log.info("NO. of Columns: {}", columnHeaders.size()); final Integer chSize = columnHeaders.size(); @@ -282,7 +282,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { rSize = row.size(); for (int j = 0; j < rSize; j++) { currColType = columnHeaders.get(j).getColumnType(); - currVal = row.get(j); + currVal = (String) row.get(j); if (currVal != null) { if (currColType.equals("DECIMAL") || currColType.equals("DOUBLE") || currColType.equals("BIGINT") || currColType.equals("SMALLINT") || currColType.equals("INT")) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java index ca887a6b0..5c9ad7fef 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java @@ -1310,7 +1310,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ sql = sql + " order by " + order; } - final List result = fillDatatableResultSetDataRows(sql); + final List result = fillDatatableResultSetDataRows(sql, columnHeaders); return new GenericResultsetData(columnHeaders, result); } @@ -1331,7 +1331,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ sql = sql + " and id = " + id; } - final List result = fillDatatableResultSetDataRows(sql); + final List result = fillDatatableResultSetDataRows(sql, columnHeaders); return new GenericResultsetData(columnHeaders, result); } @@ -1339,7 +1339,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ private CommandProcessingResult checkMainResourceExistsWithinScope(final String appTable, final Long appTableId) { final String sql = dataScopedSQL(appTable, appTableId); - LOG.info("data scoped sql: {}", sql); + LOG.debug("data scoped sql: {}", sql); final SqlRowSet rs = this.jdbcTemplate.queryForRowSet(sql); if (!rs.next()) { @@ -1471,22 +1471,30 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ return appTable; } - private List fillDatatableResultSetDataRows(final String sql) { + private List fillDatatableResultSetDataRows(final String sql, final List columnHeaders) { final List resultsetDataRows = new ArrayList<>(); + final GenericResultsetData genericResultsetData = new GenericResultsetData(columnHeaders, null); final SqlRowSet rowSet = jdbcTemplate.queryForRowSet(sql); // NOSONAR final SqlRowSetMetaData rsmd = rowSet.getMetaData(); while (rowSet.next()) { - final List columnValues = new ArrayList<>(); + final List columnValues = new ArrayList<>(); + for (int i = 0; i < rsmd.getColumnCount(); i++) { final String columnName = rsmd.getColumnName(i + 1); - final String columnValue = rowSet.getString(columnName); - columnValues.add(columnValue); + final String colType = genericResultsetData.getColTypeOfColumnNamed(columnName); + if ("DECIMAL".equalsIgnoreCase(colType)) { + columnValues.add(rowSet.getBigDecimal(columnName)); + } else if ("DATE".equalsIgnoreCase(colType) || ("TIMESTAMP WITHOUT TIME ZONE".equalsIgnoreCase(colType) // PostgreSQL + || "DATETIME".equalsIgnoreCase(colType) || "TIMESTAMP".equalsIgnoreCase(colType))) { + columnValues.add(rowSet.getObject(columnName)); + } else { + columnValues.add(rowSet.getString(columnName)); + } } - final ResultsetRowData resultsetDataRow = ResultsetRowData.create(columnValues); - resultsetDataRows.add(resultsetDataRow); + resultsetDataRows.add(ResultsetRowData.create(columnValues)); } return resultsetDataRows; @@ -1696,13 +1704,13 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ private boolean columnChanged(final String key, final String keyValue, final String colType, final GenericResultsetData grs) { - final List columnValues = grs.getData().get(0).getRow(); + final List columnValues = grs.getData().get(0).getRow(); String columnValue = null; for (int i = 0; i < grs.getColumnHeaders().size(); i++) { if (key.equals(grs.getColumnHeaders().get(i).getColumnName())) { - columnValue = columnValues.get(i); + columnValue = (String) columnValues.get(i); if (notTheSame(columnValue, keyValue, colType)) { return true; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml index bea15f721..373a15845 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml @@ -22,8 +22,8 @@ - - 8:4500ffb68c695d72caba498deff75643 + + 8:177f2e2cbac12752ede2182bbbfde6ae