FINERACT-2411: Allow empty columns to be deleted from datatables

This commit is contained in:
Ralph Hopman
2025-11-26 11:45:53 +01:00
committed by Arnold Gálovics
parent e5b6268123
commit a9d5307fe5
2 changed files with 102 additions and 2 deletions
@@ -394,9 +394,16 @@ public class DatatableWriteServiceImpl implements DatatableWriteService {
}
if (dropColumns != null) {
// Check if any of the columns to be dropped have non-NULL values
if (rowCount > 0) {
throw new GeneralPlatformDomainRuleException("error.msg.non.empty.datatable.column.cannot.be.deleted",
"Non-empty datatable columns can not be deleted.");
for (final JsonElement column : dropColumns) {
JsonObject columnAsJson = column.getAsJsonObject();
final String columnName = columnAsJson.has(API_FIELD_NAME) ? columnAsJson.get(API_FIELD_NAME).getAsString() : null;
if (columnName != null && hasNonNullValues(datatableName, columnName)) {
throw new GeneralPlatformDomainRuleException("error.msg.non.empty.datatable.column.cannot.be.deleted",
"Non-empty datatable columns can not be deleted. Column '" + columnName + "' has non-null values.");
}
}
}
StringBuilder sqlBuilder = new StringBuilder(ALTER_TABLE + sqlGenerator.escape(datatableName));
final StringBuilder constrainBuilder = new StringBuilder();
@@ -1392,6 +1399,13 @@ public class DatatableWriteServiceImpl implements DatatableWriteService {
return count == null ? 0 : count;
}
private boolean hasNonNullValues(final String datatableName, final String columnName) {
final String sql = "select count(*) from " + sqlGenerator.escape(datatableName) + " where " + sqlGenerator.escape(columnName)
+ " IS NOT NULL";
Integer count = this.jdbcTemplate.queryForObject(sql, Integer.class); // NOSONAR
return count != null && count > 0;
}
private static boolean isTechnicalParam(String param) {
return API_PARAM_DATE_FORMAT.equals(param) || API_PARAM_DATETIME_FORMAT.equals(param) || API_PARAM_LOCALE.equals(param);
}