fix oracle type columnSize QA

This commit is contained in:
SwallowGG
2024-07-10 14:54:40 +08:00
parent 025032cd05
commit 38fa3f100d
4 changed files with 85 additions and 44 deletions

View File

@ -106,12 +106,19 @@ public class OracleMetaData extends DefaultMetaService implements MetaData {
if (CollectionUtils.isNotEmpty(tableColumns)) {
Map<String, TableColumn> tableColumnMap = getTableColumns(connection, databaseName, schemaName, tableName);
for (TableColumn tableColumn : tableColumns) {
// String columnType = SqlUtils.removeDigits(tableColumn.getColumnType());
// if (columnType.startsWith("TIMESTAMP")) {
// tableColumn.setColumnSize(0);
// }
TableColumn column = tableColumnMap.get(tableColumn.getName());
tableColumn.setUnit(column.getUnit());
tableColumn.setComment(column.getComment());
tableColumn.setDefaultValue(column.getDefaultValue());
tableColumn.setOrdinalPosition(column.getOrdinalPosition());
tableColumn.setNullable(column.getNullable());
if (column != null) {
tableColumn.setUnit(column.getUnit());
tableColumn.setComment(column.getComment());
tableColumn.setDefaultValue(column.getDefaultValue());
tableColumn.setOrdinalPosition(column.getOrdinalPosition());
tableColumn.setNullable(column.getNullable());
}
}
}
return tableColumns;

View File

@ -4,6 +4,7 @@ import ai.chat2db.spi.ColumnBuilder;
import ai.chat2db.spi.enums.EditStatus;
import ai.chat2db.spi.model.ColumnType;
import ai.chat2db.spi.model.TableColumn;
import ai.chat2db.spi.util.SqlUtils;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
@ -61,7 +62,6 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
NATIONAL_CHAR_VARYING("NATIONAL CHAR VARYING", true, false, true, false, false, false, true, true, false, true),
NATIONAL_CHARACTER("NATIONAL CHARACTER", true, false, true, false, false, false, true, true, false, true),
@ -87,12 +87,17 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
SMALLINT("SMALLINT", false, false, true, false, false, false, true, true, false, false),
TIMESTAMP("TIMESTAMP", true, false, true, false, false, false, true, true, false, false),
TIMESTAMP("TIMESTAMP", false, true, true, false, false, false, true, true, false, false),
TIMESTAMP_WITH_LOCAL_TIME_ZONE("TIMESTAMP WITH LOCAL TIME ZONE", true, false, true, false, false, false, true, true, false, false),
TIMESTAMP_WITH_LOCAL_TIME_ZONE("TIMESTAMP WITH LOCAL TIME ZONE", false, true, true, false, false, false, true, true, false, false),
TIMESTAMP_WITH_TIME_ZONE("TIMESTAMP WITH TIME ZONE", true, false, true, false, false, false, true, true, false, false),
TIMESTAMP_WITH_TIME_ZONE("TIMESTAMP WITH TIME ZONE", false, true, true, false, false, false, true, true, false, false),
INTERVAL_YEAR_TO_MONTH("INTERVAL YEAR TO MONTH", true, false, true, false, false, false, true, true, false, false),
INTERVAL_DAY_TO_SECOND("INTERVAL DAY TO SECOND", true, true, true, false, false, false, true, true, false, false),
UROWID("UROWID", true, false, true, false, false, false, true, true, false, false),
@ -104,7 +109,7 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
private ColumnType columnType;
public static OracleColumnTypeEnum getByType(String dataType) {
return COLUMN_TYPE_MAP.get(dataType.toUpperCase());
return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
}
private static Map<String, OracleColumnTypeEnum> COLUMN_TYPE_MAP = Maps.newHashMap();
@ -136,7 +141,7 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
script.append(buildDataType(column, type)).append(" ");
script.append(buildDefaultValue(column,type)).append(" ");
script.append(buildDefaultValue(column, type)).append(" ");
script.append(buildNullable(column, type)).append(" ");
@ -144,11 +149,11 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
}
private String buildNullable(TableColumn column,OracleColumnTypeEnum type) {
if(!type.getColumnType().isSupportNullable()){
private String buildNullable(TableColumn column, OracleColumnTypeEnum type) {
if (!type.getColumnType().isSupportNullable()) {
return "";
}
if (column.getNullable()!=null && 1==column.getNullable()) {
if (column.getNullable() != null && 1 == column.getNullable()) {
return "NULL";
} else {
return "NOT NULL";
@ -156,27 +161,27 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
}
private String buildDefaultValue(TableColumn column, OracleColumnTypeEnum type) {
if(!type.getColumnType().isSupportDefaultValue() || StringUtils.isEmpty(column.getDefaultValue())){
if (!type.getColumnType().isSupportDefaultValue() || StringUtils.isEmpty(column.getDefaultValue())) {
return "";
}
if("EMPTY_STRING".equalsIgnoreCase(column.getDefaultValue().trim())){
if ("EMPTY_STRING".equalsIgnoreCase(column.getDefaultValue().trim())) {
return StringUtils.join("DEFAULT ''");
}
if("NULL".equalsIgnoreCase(column.getDefaultValue().trim())){
if ("NULL".equalsIgnoreCase(column.getDefaultValue().trim())) {
return StringUtils.join("DEFAULT NULL");
}
return StringUtils.join("DEFAULT ",column.getDefaultValue());
return StringUtils.join("DEFAULT ", column.getDefaultValue());
}
private String buildDataType(TableColumn column, OracleColumnTypeEnum type) {
String columnType = type.columnType.getTypeName();
if (Arrays.asList(CHAR, CHAR_VARYING, CHARACTER, CHARACTER_VARYING,
NVARCHAR2, VARCHAR, VARCHAR2,NATIONAL_CHAR,
NATIONAL_CHAR_VARYING,NATIONAL_CHARACTER,
NATIONAL_CHARACTER_VARYING,NCHAR,NCHAR_VARYING).contains(type)) {
NVARCHAR2, VARCHAR, VARCHAR2, NATIONAL_CHAR,
NATIONAL_CHAR_VARYING, NATIONAL_CHARACTER,
NATIONAL_CHARACTER_VARYING, NCHAR, NCHAR_VARYING).contains(type)) {
StringBuilder script = new StringBuilder();
script.append(columnType);
if (column.getColumnSize() != null && StringUtils.isEmpty(column.getUnit())) {
@ -187,26 +192,41 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
return script.toString();
}
if (Arrays.asList(DECIMAL, FLOAT, NUMBER, UROWID,RAW,TIMESTAMP).contains(type)) {
if (Arrays.asList(DECIMAL, FLOAT, NUMBER, UROWID, RAW).contains(type)) {
StringBuilder script = new StringBuilder();
script.append(columnType);
if (column.getColumnSize() != null && column.getDecimalDigits() == null) {
script.append("(").append(column.getColumnSize()).append(")");
} else if (column.getColumnSize() != null && column.getDecimalDigits() != null) {
} else if (column.getColumnSize() != null && column.getDecimalDigits() != null) {
script.append("(").append(column.getColumnSize()).append(",").append(column.getDecimalDigits()).append(")");
}
return script.toString();
}
if (Arrays.asList(TIMESTAMP_WITH_TIME_ZONE,TIMESTAMP_WITH_LOCAL_TIME_ZONE).contains(type)) {
StringBuilder script = new StringBuilder();
if(column.getColumnSize() == null){
script.append(columnType);
}else {
String [] split = columnType.split("TIMESTAMP");
script.append("TIMESTAMP").append("(").append(column.getColumnSize()).append(")").append(split[1]);
}
return script.toString();
if (Arrays.asList(TIMESTAMP).contains(type)) {
int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6;
String valueTemplate = "TIMESTAMP(%s)";
return String.format(valueTemplate, decimalDigits);
}
if (Arrays.asList(TIMESTAMP_WITH_TIME_ZONE).contains(type)) {
int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6;
String valueTemplate = "TIMESTAMP(%s) WITH TIME ZONE";
return String.format(valueTemplate, decimalDigits);
}
if (Arrays.asList(TIMESTAMP_WITH_LOCAL_TIME_ZONE).contains(type)) {
int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6;
String valueTemplate = "TIMESTAMP(%s) WITH LOCAL TIME ZONE";
return String.format(valueTemplate, decimalDigits);
}
if (Arrays.asList(INTERVAL_DAY_TO_SECOND).contains(type)) {
int columnSize = column.getColumnSize() != null ? column.getColumnSize() : 2;
int decimalDigits = column.getDecimalDigits() != null ? column.getDecimalDigits() : 6;
String valueTemplate = "INTERVAL DAY(%s) TO SECOND(%s)";
return String.format(valueTemplate, columnSize, decimalDigits);
}
if (Arrays.asList(INTERVAL_YEAR_TO_MONTH).contains(type)) {
int columnSize = column.getColumnSize() != null ? column.getColumnSize() : 2;
String valueTemplate = "INTERVAL YEAR(%s) TO MONTH";
return String.format(valueTemplate, columnSize);
}
@ -214,30 +234,29 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
}
@Override
public String buildModifyColumn(TableColumn tableColumn) {
if (EditStatus.DELETE.name().equals(tableColumn.getEditStatus())) {
StringBuilder script = new StringBuilder();
script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append(" ").append("DROP COLUMN ").append("\"").append(tableColumn.getName()).append("\"");
return script.toString();
}
if (EditStatus.ADD.name().equals(tableColumn.getEditStatus())) {
StringBuilder script = new StringBuilder();
script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append(" ").append("ADD (").append(buildCreateColumnSql(tableColumn)).append(")");
return script.toString();
}
if (EditStatus.MODIFY.name().equals(tableColumn.getEditStatus())) {
StringBuilder script = new StringBuilder();
script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append(" ").append("MODIFY (").append(buildModifyColumnSql(tableColumn,tableColumn.getOldColumn())).append(") \n" );
script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append(" ").append("MODIFY (").append(buildModifyColumnSql(tableColumn, tableColumn.getOldColumn())).append(") \n");
if (!StringUtils.equalsIgnoreCase(tableColumn.getOldName(), tableColumn.getName())) {
script.append(";");
script.append("ALTER TABLE "). append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append("ALTER TABLE ").append("\"").append(tableColumn.getSchemaName()).append("\".\"").append(tableColumn.getTableName()).append("\"");
script.append(" ").append("RENAME COLUMN ").append("\"").append(tableColumn.getOldName()).append("\"").append(" TO ").append("\"").append(tableColumn.getName()).append("\"");
}
@ -247,7 +266,7 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
return "";
}
public String buildModifyColumnSql(TableColumn column,TableColumn oldColumn) {
public String buildModifyColumnSql(TableColumn column, TableColumn oldColumn) {
OracleColumnTypeEnum type = COLUMN_TYPE_MAP.get(column.getColumnType().toUpperCase());
if (type == null) {
return "";
@ -258,16 +277,16 @@ public enum OracleColumnTypeEnum implements ColumnBuilder {
script.append(buildDataType(column, type)).append(" ");
script.append(buildDefaultValue(column,type)).append(" ");
script.append(buildDefaultValue(column, type)).append(" ");
if(oldColumn.getNullable() != column.getNullable()) {
if (oldColumn.getNullable() != column.getNullable()) {
script.append(buildNullable(column, type)).append(" ");
}
return script.toString();
}
public static List<ColumnType> getTypes(){
public static List<ColumnType> getTypes() {
return Arrays.stream(OracleColumnTypeEnum.values()).map(columnTypeEnum ->
columnTypeEnum.getColumnType()
).toList();