FINERACT-1996: Reporting should support query that includes json path for DB field in Postgres

This commit is contained in:
jmarta
2023-10-31 11:13:23 +01:00
committed by Adam Saghy
parent 24cb62443e
commit 03e71a29ff
13 changed files with 167 additions and 175 deletions
@@ -23,6 +23,7 @@ import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaT
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.DATETIME;
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.DECIMAL;
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.INTEGER;
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.JSON;
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.TEXT;
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.TIMESTAMP;
import static org.apache.fineract.infrastructure.core.service.database.JdbcJavaType.VARCHAR;
@@ -40,6 +41,7 @@ import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiCon
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_DATETIME;
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_DECIMAL;
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_DROPDOWN;
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_JSON;
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_NUMBER;
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_STRING;
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_TEXT;
@@ -97,7 +99,8 @@ public class DatatableCommandFromApiJsonDeserializer {
API_FIELD_MANDATORY, API_FIELD_AFTER, API_FIELD_CODE, API_FIELD_NEWCODE, API_FIELD_UNIQUE, API_FIELD_INDEXED);
private static final Set<String> SUPPORTED_PARAMETERS_FOR_DROP_COLUMNS = Set.of(API_FIELD_NAME);
private static final Object[] SUPPORTED_COLUMN_TYPES = { API_FIELD_TYPE_STRING, API_FIELD_TYPE_NUMBER, API_FIELD_TYPE_BOOLEAN,
API_FIELD_TYPE_DECIMAL, API_FIELD_TYPE_DATE, API_FIELD_TYPE_DATETIME, API_FIELD_TYPE_TEXT, API_FIELD_TYPE_DROPDOWN };
API_FIELD_TYPE_DECIMAL, API_FIELD_TYPE_DATE, API_FIELD_TYPE_DATETIME, API_FIELD_TYPE_TEXT, API_FIELD_TYPE_JSON,
API_FIELD_TYPE_DROPDOWN };
private final FromJsonHelper fromApiJsonHelper;
private final DatabaseTypeResolver databaseTypeResolver;
@@ -344,6 +347,8 @@ public class DatatableCommandFromApiJsonDeserializer {
return TIMESTAMP;
case API_FIELD_TYPE_TEXT:
return TEXT;
case API_FIELD_TYPE_JSON:
return JSON;
default: {
if (fail) {
throw new PlatformDataIntegrityException("error.msg.datatable.column.type.invalid",
@@ -85,5 +85,6 @@ public final class DataTableApiConstant {
public static final String API_FIELD_TYPE_DATETIME = "datetime";
public static final String API_FIELD_TYPE_TIMESTAMP = "timestamp";
public static final String API_FIELD_TYPE_TEXT = "text";
public static final String API_FIELD_TYPE_JSON = "json";
public static final String API_FIELD_TYPE_DROPDOWN = "dropdown";
}
@@ -117,7 +117,7 @@ public class GenericDataServiceImpl implements GenericDataService {
// primary keys and unique constrained columns are automatically indexed
final boolean columnIsIndexed = columnIsPrimaryKey || columnIsUnique
|| isExplicitlyIndexed(tableName, columnName, indexDefinitions);
JdbcJavaType jdbcType = JdbcJavaType.getByTypeName(dialect, columnType);
JdbcJavaType jdbcType = JdbcJavaType.getByTypeName(dialect, columnType, false);
List<ResultsetColumnValueData> columnValues = new ArrayList<>();
String codeName = null;
@@ -1323,7 +1323,6 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
params.add(SearchUtil.parseJdbcColumnValue(columnHeader, dataParams.get(key), dateFormat, dateTimeFormat, locale, false,
sqlGenerator));
}
final String sql = sqlGenerator.buildInsert(dataTableName, insertColumns);
if (addScore) {
List<Object> scoreIds = params.stream().filter(e -> e != null && !String.valueOf(e).isBlank()).toList();
int scoreValue;
@@ -1339,6 +1338,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
insertColumns.add("score");
params.add(scoreValue);
}
final String sql = sqlGenerator.buildInsert(dataTableName, insertColumns, headersByName);
try {
int updated = jdbcTemplate.update(sql, params.toArray(Object[]::new));
if (updated != 1) {
@@ -1446,8 +1447,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
Locale locale = localeString == null ? null : JsonParserHelper.localeFromString(localeString);
DatabaseType dialect = sqlGenerator.getDialect();
List<String> updateColumns = new ArrayList<>(List.of(UPDATEDAT_FIELD_NAME));
List<Object> params = new ArrayList<>(List.of(DateUtils.getAuditLocalDateTime()));
ArrayList<String> updateColumns = new ArrayList<>(List.of(UPDATEDAT_FIELD_NAME));
ArrayList<Object> params = new ArrayList<>(List.of(DateUtils.getAuditLocalDateTime()));
final HashMap<String, Object> changes = new HashMap<>();
for (String key : dataParams.keySet()) {
if (isTechnicalParam(key)) {
@@ -1474,7 +1475,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
if (!updateColumns.isEmpty()) {
ResultsetColumnHeaderData pkColumn = SearchUtil.getFiltered(columnHeaders, ResultsetColumnHeaderData::getIsColumnPrimaryKey);
params.add(primaryKey);
final String sql = sqlGenerator.buildUpdate(dataTableName, updateColumns) + " WHERE " + pkColumn.getColumnName() + " = ?";
final String sql = sqlGenerator.buildUpdate(dataTableName, updateColumns, headersByName) + " WHERE " + pkColumn.getColumnName()
+ " = ?";
int updated = jdbcTemplate.update(sql, params.toArray(Object[]::new));
if (updated != 1) {
throw new PlatformDataIntegrityException("error.msg.invalid.update", "Expected one updated row.");