adamsaghy commented on code in PR #3385:
URL: https://github.com/apache/fineract/pull/3385#discussion_r1301407333
##########
fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java:
##########
@@ -734,95 +727,106 @@ private long addMultirowRecord(String sql) throws
SQLException {
}
private void parseDatatableColumnForUpdate(final JsonObject column,
- final Map<String, ResultsetColumnHeaderData>
mapColumnNameDefinition, StringBuilder sqlBuilder, final String datatableName,
- final StringBuilder constrainBuilder, final Map<String, Long>
codeMappings, final List<String> removeMappings,
- final boolean isConstraintApproach) {
- String name = column.has(API_FIELD_NAME) ?
column.get(API_FIELD_NAME).getAsString() : null;
+ final Map<String, ResultsetColumnHeaderData>
mapColumnNameDefinition, final String datatableName, StringBuilder
renameBuilder,
+ StringBuilder changeBuilder, final StringBuilder constrainBuilder,
final Map<String, Long> codeMappings,
+ final List<String> removeMappings, final boolean
isConstraintApproach) {
+ String oldName = column.has(API_FIELD_NAME) ?
column.get(API_FIELD_NAME).getAsString() : null;
+ if (!mapColumnNameDefinition.containsKey(oldName)) {
+ throw new
PlatformDataIntegrityException("error.msg.datatable.column.missing.update.parse",
+ "Column " + oldName + " does not exist.", oldName);
+ }
final String lengthStr = column.has(API_FIELD_LENGTH) ?
column.get(API_FIELD_LENGTH).getAsString() : null;
- Integer length = StringUtils.isNotBlank(lengthStr) ?
Integer.parseInt(lengthStr) : null;
- String newName = column.has(API_FIELD_NEWNAME) ?
column.get(API_FIELD_NEWNAME).getAsString() : name;
- final Boolean mandatory = column.has(API_FIELD_MANDATORY) ?
column.get(API_FIELD_MANDATORY).getAsBoolean() : false;
+ Long length = StringUtils.isNotBlank(lengthStr) ?
Long.parseLong(lengthStr) : null;
+ String newName = column.has(API_FIELD_NEWNAME) ?
column.get(API_FIELD_NEWNAME).getAsString() : null;
+ final Boolean newMandatory = column.has(API_FIELD_MANDATORY) ?
column.get(API_FIELD_MANDATORY).getAsBoolean() : null;
final String after = column.has(API_FIELD_AFTER) ?
column.get(API_FIELD_AFTER).getAsString() : null;
final String code = column.has(API_FIELD_CODE) ?
column.get(API_FIELD_CODE).getAsString() : null;
final String newCode = column.has(API_FIELD_NEWCODE) ?
column.get(API_FIELD_NEWCODE).getAsString() : null;
final String dataTableNameAlias =
datatableName.toLowerCase().replaceAll("\\s", "_");
if (isConstraintApproach) {
if (StringUtils.isBlank(newName)) {
- newName = name;
+ newName = oldName;
}
- String fkName = "fk_" + dataTableNameAlias + "_" + name;
+ String fkName = "fk_" + dataTableNameAlias + "_" + oldName;
String newFkName = "fk_" + dataTableNameAlias + "_" + newName;
- if (!StringUtils.equalsIgnoreCase(code, newCode) ||
!StringUtils.equalsIgnoreCase(name, newName)) {
+ if (!StringUtils.equalsIgnoreCase(code, newCode) ||
!StringUtils.equalsIgnoreCase(oldName, newName)) {
if (StringUtils.equalsIgnoreCase(code, newCode)) {
- final int codeId = getCodeIdForColumn(dataTableNameAlias,
name);
+ final int codeId = getCodeIdForColumn(dataTableNameAlias,
oldName);
if (codeId > 0) {
- removeMappings.add(dataTableNameAlias + "_" + name);
- constrainBuilder.append(", DROP FOREIGN KEY
").append(sqlGenerator.escape(fkName)).append(" ");
+ removeMappings.add(dataTableNameAlias + "_" + oldName);
+ constrainBuilder.append(", DROP CONSTRAINT
").append(sqlGenerator.escape(fkName)).append(" ");
codeMappings.put(dataTableNameAlias + "_" + newName,
(long) codeId);
- constrainBuilder.append(",ADD CONSTRAINT
").append(sqlGenerator.escape(newFkName)).append(" ")
- .append("FOREIGN KEY (" +
sqlGenerator.escape(newName) + ") ").append("REFERENCES ")
+ constrainBuilder.append(", ADD CONSTRAINT
").append(sqlGenerator.escape(newFkName)).append(" ")
+ .append("FOREIGN KEY
(").append(sqlGenerator.escape(newName)).append(") ").append("REFERENCES ")
.append(sqlGenerator.escape(CODE_VALUES_TABLE)).append("
(").append(TABLE_FIELD_ID).append(")");
}
} else {
if (code != null) {
- removeMappings.add(dataTableNameAlias + "_" + name);
- if (newCode == null ||
!StringUtils.equalsIgnoreCase(name, newName)) {
- constrainBuilder.append(", DROP FOREIGN KEY
").append(sqlGenerator.escape(fkName)).append(" ");
+ removeMappings.add(dataTableNameAlias + "_" + oldName);
+ if (newCode == null ||
!StringUtils.equalsIgnoreCase(oldName, newName)) {
+ constrainBuilder.append(", DROP CONSTRAINT
").append(sqlGenerator.escape(fkName)).append(" ");
}
}
if (newCode != null) {
codeMappings.put(dataTableNameAlias + "_" + newName,
this.codeReadPlatformService.retriveCode(newCode).getId());
- if (code == null ||
!StringUtils.equalsIgnoreCase(name, newName)) {
- constrainBuilder.append(",ADD CONSTRAINT
").append(sqlGenerator.escape(newFkName)).append(" ")
- .append("FOREIGN KEY (" +
sqlGenerator.escape(newName) + ") ").append("REFERENCES ")
+ if (code == null ||
!StringUtils.equalsIgnoreCase(oldName, newName)) {
+ constrainBuilder.append(", ADD CONSTRAINT
").append(sqlGenerator.escape(newFkName)).append(" ")
+ .append("FOREIGN KEY
(").append(sqlGenerator.escape(newName)).append(") ").append("REFERENCES ")
.append(sqlGenerator.escape(CODE_VALUES_TABLE)).append("
(").append(TABLE_FIELD_ID).append(")");
}
}
}
}
} else {
if (StringUtils.isNotBlank(code)) {
- name = datatableColumnNameToCodeValueName(name, code);
+ oldName = datatableColumnNameToCodeValueName(oldName, code);
if (StringUtils.isNotBlank(newCode)) {
newName = datatableColumnNameToCodeValueName(newName,
newCode);
} else {
newName = datatableColumnNameToCodeValueName(newName,
code);
}
}
}
- if (!mapColumnNameDefinition.containsKey(name)) {
- throw new
PlatformDataIntegrityException("error.msg.datatable.column.missing.update.parse",
- "Column " + name + " does not exist.", name);
- }
- final JdbcJavaType type =
mapColumnNameDefinition.get(name).getColumnType();
DatabaseType dialect = databaseTypeResolver.databaseType();
- if (length == null && type.hasPrecision(dialect)) {
- Long columnLength =
mapColumnNameDefinition.get(name).getColumnLength();
- length = columnLength == null ? null : columnLength.intValue();
- }
-
- if (databaseTypeResolver.isMySQL()) {
- sqlBuilder.append(", CHANGE
").append(sqlGenerator.escape(name)).append("
").append(sqlGenerator.escape(newName)).append(" ")
- .append(type);
- } else if (databaseTypeResolver.isPostgreSQL()) {
- sqlBuilder.append(", RENAME
").append(sqlGenerator.escape(name)).append(" TO
").append(sqlGenerator.escape(newName));
- }
- if (length != null && length > 0) {
+ ResultsetColumnHeaderData columnHeader =
mapColumnNameDefinition.get(oldName);
+ final JdbcJavaType type = columnHeader.getColumnType();
+ boolean nameChanged = !StringUtils.isBlank(newName) &&
!newName.equals(oldName);
+ boolean lengthChanged = length != null &&
!length.equals(columnHeader.getColumnLength()) && type.hasPrecision(dialect);
+ boolean nullityChanged = newMandatory != null && newMandatory !=
columnHeader.isMandatory();
+ boolean afterChanged = after != null && databaseTypeResolver.isMySQL();
+ if (nameChanged || lengthChanged || nullityChanged || afterChanged) {
+ Integer precision = length == null ? null : length.intValue();
+ Integer scale = null;
if (type.isDecimalType()) {
- sqlBuilder.append(" ").append(type.formatSql(dialect, 19, 6));
+ precision = 19;
+ scale = 6;
+ }
+ String colName = StringUtils.isBlank(newName) ? oldName : newName;
+ boolean mandatory = newMandatory == null ?
columnHeader.isMandatory() : newMandatory;
+ if (databaseTypeResolver.isMySQL()) {
+ String modifySql = nameChanged ? ("CHANGE " +
sqlGenerator.escape(oldName) + " " + sqlGenerator.escape(colName))
Review Comment:
Are you sure the CHANGE is working for Postgres and Mysql / Mariadb as well?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]