FINERACT-1996: Reporting should support query that includes json path for DB field in Postgres
This commit is contained in:
+6
-1
@@ -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",
|
||||
|
||||
+1
@@ -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";
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+6
-4
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user