diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlIndexTypeEnum.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlIndexTypeEnum.java index de016223..a03c29a6 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlIndexTypeEnum.java +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlIndexTypeEnum.java @@ -88,7 +88,11 @@ public enum MysqlIndexTypeEnum { script.append("("); for (TableIndexColumn column : tableIndex.getColumnList()) { if(StringUtils.isNotBlank(column.getColumnName())) { - script.append("`").append(column.getColumnName()).append("`").append(","); + script.append("`").append(column.getColumnName()).append("`"); + if (!StringUtils.isBlank(column.getAscOrDesc()) && !PRIMARY_KEY.equals(this)) { + script.append(" ").append(column.getAscOrDesc()); + } + script.append(","); } } script.deleteCharAt(script.length() - 1); diff --git a/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/type/SqlServerIndexTypeEnum.java b/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/type/SqlServerIndexTypeEnum.java index 8547f6ea..0d76e380 100644 --- a/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/type/SqlServerIndexTypeEnum.java +++ b/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/type/SqlServerIndexTypeEnum.java @@ -92,7 +92,7 @@ public enum SqlServerIndexTypeEnum { for (TableIndexColumn column : tableIndex.getColumnList()) { if (StringUtils.isNotBlank(column.getColumnName())) { script.append("[").append(column.getColumnName()).append("]"); - if (!StringUtils.isBlank(column.getAscOrDesc())) { + if (!StringUtils.isBlank(column.getAscOrDesc()) && !PRIMARY_KEY.equals(this)) { script.append(" ").append(column.getAscOrDesc()); } script.append(","); diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java index 9323d721..7352202d 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java @@ -151,9 +151,9 @@ public class DlTemplateServiceImpl implements DlTemplateService { executeResult.setSqlType(sqlType); executeResult.setOriginalSql(originalSql); try { - executeResult.setCanEdit(SqlUtils.canEdit(originalSql)); - executeResult.setTableName(SqlUtils.getTableName(originalSql, dbType)); + SqlUtils.buildCanEditResult(originalSql, dbType,executeResult); } catch (Exception e) { + } if (SqlTypeEnum.SELECT.getCode().equals(sqlType)) { executeResult.setPageNo(pageNo); @@ -258,8 +258,7 @@ public class DlTemplateServiceImpl implements DlTemplateService { private String getDeleteSql(UpdateSelectResultParam param, List row, MetaData metaSchema) { StringBuilder script = new StringBuilder(); - script.append("DELETE FROM ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName())) - .append(""); + script.append("DELETE FROM ").append( param.getTableName()).append(""); script.append(buildWhere(param.getHeaderList(), row, metaSchema)); return script.toString(); @@ -292,7 +291,7 @@ public class DlTemplateServiceImpl implements DlTemplateService { return ""; } StringBuilder script = new StringBuilder(); - script.append("INSERT INTO ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName())) + script.append("INSERT INTO ").append( param.getTableName()) .append(" ("); for (int i = 1; i < row.size(); i++) { Header header = param.getHeaderList().get(i); @@ -319,8 +318,7 @@ public class DlTemplateServiceImpl implements DlTemplateService { if (CollectionUtils.isEmpty(row) || CollectionUtils.isEmpty(odlRow)) { return ""; } - script.append("UPDATE ").append(metaSchema.getMetaDataName(param.getDatabaseName(), param.getSchemaName(), param.getTableName())) - .append(" set "); + script.append("UPDATE ").append(param.getTableName()).append(" set "); for (int i = 1; i < row.size(); i++) { String newValue = row.get(i); String oldValue = odlRow.get(i); diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java index 4a0a62fc..1d73fea5 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java @@ -252,7 +252,7 @@ public class TableServiceImpl implements TableService { Connection connection = Chat2DBContext.getConnection(); long n = 0; try (ResultSet resultSet = connection.getMetaData().getTables(databaseName, schemaName, null, - new String[]{"TABLE"})) { + new String[]{"TABLE","SYSTEM TABLE"})) { List cacheDOS = new ArrayList<>(); while (resultSet.next()) { TableCacheDO tableCacheDO = new TableCacheDO(); diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java index 6ec6b09d..8f39e920 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultMetaService.java @@ -34,7 +34,7 @@ public class DefaultMetaService implements MetaData { @Override public List tables(Connection connection, String databaseName, String schemaName, String tableName) { - return SQLExecutor.getInstance().tables(connection, StringUtils.isEmpty(databaseName) ? null : databaseName, StringUtils.isEmpty(schemaName) ? null : schemaName, tableName, new String[]{"TABLE"}); + return SQLExecutor.getInstance().tables(connection, StringUtils.isEmpty(databaseName) ? null : databaseName, StringUtils.isEmpty(schemaName) ? null : schemaName, tableName, new String[]{"TABLE","SYSTEM TABLE"}); } @Override diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java index f40311fe..e6aef38d 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/util/SqlUtils.java @@ -1,60 +1,17 @@ package ai.chat2db.spi.util; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import ai.chat2db.server.tools.common.util.EasyIntegerUtils; +import ai.chat2db.server.tools.base.excption.BusinessException; import ai.chat2db.spi.enums.DataTypeEnum; +import ai.chat2db.spi.model.ExecuteResult; import com.alibaba.druid.DbType; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLDataTypeImpl; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.ast.statement.SQLAssignItem; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; -import com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; -import com.alibaba.druid.sql.ast.statement.SQLNotNullConstraint; -import com.alibaba.druid.sql.ast.statement.SQLNullConstraint; -import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement.Item; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.parser.SQLParserUtils; - -import ai.chat2db.server.tools.base.excption.BusinessException; -import ai.chat2db.server.tools.common.util.EasyBooleanUtils; -import ai.chat2db.server.tools.common.util.EasyCollectionUtils; -import ai.chat2db.server.tools.common.util.EasyEnumUtils; -import ai.chat2db.spi.enums.CollationEnum; -import ai.chat2db.spi.enums.IndexTypeEnum; -import ai.chat2db.spi.model.Sql; -import ai.chat2db.spi.model.Table; -import ai.chat2db.spi.model.TableColumn; -import ai.chat2db.spi.model.TableIndex; -import ai.chat2db.spi.model.TableIndexColumn; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.Statements; @@ -62,10 +19,13 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectExpressionItem; import net.sf.jsqlparser.statement.select.SelectItem; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + /** * @author jipengfei * @version : SqlUtils.java @@ -74,8 +34,7 @@ public class SqlUtils { public static final String DEFAULT_TABLE_NAME = "table1"; - - public static boolean canEdit(String sql) { + public static void buildCanEditResult(String sql, DbType dbType, ExecuteResult executeResult) { try { Statement statement = CCJSqlParserUtil.parse(sql); if (statement instanceof Select) { @@ -86,388 +45,28 @@ public class SqlUtils { if (item instanceof SelectExpressionItem) { SelectExpressionItem expressionItem = (SelectExpressionItem) item; if (expressionItem.getAlias() != null) { - return false; // 找到了一个别名 + //canEdit = false; // 找到了一个别名 + executeResult.setCanEdit(false); + return ; } } } - return true; + executeResult.setCanEdit(true); + SQLStatement sqlStatement = SQLUtils.parseSingleStatement(sql, dbType); + if ((sqlStatement instanceof SQLSelectStatement sqlSelectStatement)) { + SQLExprTableSource sqlExprTableSource = (SQLExprTableSource) getSQLExprTableSource( + sqlSelectStatement.getSelect().getFirstQueryBlock().getFrom()); + executeResult.setTableName(getMetaDataTableName(sqlExprTableSource.getCatalog(), sqlExprTableSource.getSchema(), sqlExprTableSource.getTableName())); + } } } } catch (Exception e) { - return false; - } - return false; - } - - public static List buildSql(Table oldTable, Table newTable) { - List sqlList = new ArrayList<>(); - // 创建表 - if (oldTable == null) { - MySqlCreateTableStatement mySqlCreateTableStatement = new MySqlCreateTableStatement(); - mySqlCreateTableStatement.setDbType(DbType.mysql); - mySqlCreateTableStatement.setTableName(newTable.getName()); - if (!Objects.isNull(newTable.getComment())) { - mySqlCreateTableStatement.setComment(new MySqlCharExpr(newTable.getComment())); - } - List columnList = newTable.getColumnList(); - if (!CollectionUtils.isEmpty(columnList)) { - for (TableColumn tableColumn : columnList) { - SQLColumnDefinition sqlColumnDefinition = new SQLColumnDefinition(); - mySqlCreateTableStatement.addColumn(sqlColumnDefinition); - sqlColumnDefinition.setName(tableColumn.getName()); - sqlColumnDefinition.setDataType(new SQLDataTypeImpl(tableColumn.getColumnType())); - if (tableColumn.getNullable() == 1) { - sqlColumnDefinition.addConstraint(new SQLNullConstraint()); - } else { - sqlColumnDefinition.addConstraint(new SQLNotNullConstraint()); - } - if (!Objects.isNull(tableColumn.getDefaultValue())) { - sqlColumnDefinition.setDefaultExpr(new MySqlCharExpr(tableColumn.getDefaultValue())); - } - sqlColumnDefinition.setAutoIncrement(BooleanUtils.isTrue(tableColumn.getAutoIncrement())); - if (!Objects.isNull(tableColumn.getComment())) { - sqlColumnDefinition.setComment(tableColumn.getComment()); - } - if (BooleanUtils.isTrue(tableColumn.getPrimaryKey())) { - sqlColumnDefinition.addConstraint(new SQLColumnPrimaryKey()); - } - } - //// 主键 - //List primaryKeyColumnList = EasyCollectionUtils.stream(columnList) - // .filter(tableColumn -> BooleanUtils.isTrue(tableColumn.getPrimaryKey())) - // .collect(Collectors.toList()); - //if (!CollectionUtils.isEmpty(primaryKeyColumnList)) { - // MySqlPrimaryKey mySqlPrimaryKey = new MySqlPrimaryKey(); - // mySqlCreateTableStatement.getTableElementList().add(mySqlPrimaryKey); - // for (TableColumn tableColumn : primaryKeyColumnList) { - // mySqlPrimaryKey.addColumn(new SQLIdentifierExpr(tableColumn.getName())); - // } - //} - } - - // 索引 - List indexList = newTable.getIndexList(); - if (!CollectionUtils.isEmpty(indexList)) { - for (TableIndex tableIndex : indexList) { - if (IndexTypeEnum.UNIQUE.getCode().equals(tableIndex.getType())) { - MySqlUnique mySqlUnique = new MySqlUnique(); - mySqlCreateTableStatement.getTableElementList().add(mySqlUnique); - mySqlUnique.setName(tableIndex.getName()); - mySqlUnique.setComment(new SQLCharExpr(tableIndex.getComment())); - mySqlUnique.getIndexDefinition().setType("unique"); - if (!CollectionUtils.isEmpty(tableIndex.getColumnList())) { - for (TableIndexColumn tableIndexColumn : tableIndex.getColumnList()) { - SQLSelectOrderByItem sqlSelectOrderByItem = new SQLSelectOrderByItem(); - sqlSelectOrderByItem.setExpr(new SQLIdentifierExpr(tableIndexColumn.getColumnName())); - CollationEnum collation = EasyEnumUtils.getEnum(CollationEnum.class, - tableIndexColumn.getCollation()); - if (collation != null) { - sqlSelectOrderByItem.setType(collation.getSqlOrderingSpecification()); - } - mySqlUnique.addColumn(sqlSelectOrderByItem); - } - } - } else { - MySqlTableIndex mySqlTableIndex = new MySqlTableIndex(); - mySqlCreateTableStatement.getTableElementList().add(mySqlTableIndex); - mySqlTableIndex.setName(tableIndex.getName()); - mySqlTableIndex.setComment(new SQLCharExpr(tableIndex.getComment())); - if (!CollectionUtils.isEmpty(tableIndex.getColumnList())) { - for (TableIndexColumn tableIndexColumn : tableIndex.getColumnList()) { - SQLSelectOrderByItem sqlSelectOrderByItem = new SQLSelectOrderByItem(); - sqlSelectOrderByItem.setExpr(new SQLIdentifierExpr(tableIndexColumn.getColumnName())); - CollationEnum collation = EasyEnumUtils.getEnum(CollationEnum.class, - tableIndexColumn.getCollation()); - if (collation != null) { - sqlSelectOrderByItem.setType(collation.getSqlOrderingSpecification()); - } - mySqlTableIndex.addColumn(sqlSelectOrderByItem); - } - } - } - } - } - - sqlList.add(Sql.builder().sql(mySqlCreateTableStatement + ";").build()); - return sqlList; - } - - // 修改表结构 - // 修改表名字 - if (!StringUtils.equals(oldTable.getName(), newTable.getName())) { - MySqlRenameTableStatement mySqlRenameTableStatement = new MySqlRenameTableStatement(); - mySqlRenameTableStatement.setDbType(DbType.mysql); - Item item = new Item(); - item.setName(new SQLIdentifierExpr(oldTable.getName())); - item.setTo(new SQLIdentifierExpr(newTable.getName())); - mySqlRenameTableStatement.addItem(item); - sqlList.add(Sql.builder().sql(mySqlRenameTableStatement + ";").build()); - } - // 修改注释 - if (!StringUtils.equals(oldTable.getComment(), newTable.getComment())) { - SQLAlterTableStatement sqlAlterTableStatement = new SQLAlterTableStatement(); - sqlAlterTableStatement.setDbType(DbType.mysql); - SQLAssignItem sqlAssignItem = new SQLAssignItem(); - sqlAssignItem.setTarget(new SQLIdentifierExpr("COMMENT")); - sqlAssignItem.setValue(new MySqlCharExpr(newTable.getComment())); - sqlAlterTableStatement.getTableOptions().add(sqlAssignItem); - sqlList.add(Sql.builder().sql(sqlAlterTableStatement + ";").build()); - } - // 修改字段 - modifyColumn(sqlList, oldTable, newTable); - - // 修改索引 - modifyIndex(sqlList, oldTable, newTable); - return sqlList; - } - - private static void modifyColumn(List sqlList, Table oldTable, Table newTable) { - Map oldColumnMap = EasyCollectionUtils.toIdentityMap(oldTable.getColumnList(), - tableColumn -> { - if (tableColumn.getOldName() != null) { - return tableColumn.getOldName(); - } - return tableColumn.getName(); - }); - Map newColumnMap = EasyCollectionUtils.toIdentityMap(newTable.getColumnList(), - tableColumn -> { - if (tableColumn.getOldName() != null) { - return tableColumn.getOldName(); - } - return tableColumn.getName(); - }); - - SQLAlterTableStatement sqlAlterTableStatement = new SQLAlterTableStatement(); - sqlAlterTableStatement.setDbType(DbType.mysql); - sqlAlterTableStatement.setTableSource(new SQLIdentifierExpr(newTable.getName())); - - newColumnMap.forEach((newTableColumnName, newTableColumn) -> { - TableColumn oldTableColumn = oldColumnMap.get(newTableColumnName); - // 代表新增字段 - if (oldTableColumn == null) { - - SQLAlterTableAddColumn sqlAlterTableAddColumn = new SQLAlterTableAddColumn(); - sqlAlterTableStatement.addItem(sqlAlterTableAddColumn); - SQLColumnDefinition sqlColumnDefinition = new SQLColumnDefinition(); - sqlAlterTableAddColumn.addColumn(sqlColumnDefinition); - sqlColumnDefinition.setName(newTableColumn.getName()); - sqlColumnDefinition.setDataType(new SQLDataTypeImpl(newTableColumn.getColumnType())); - if (newTableColumn.getNullable() != 1) { - sqlColumnDefinition.addConstraint(new SQLNotNullConstraint()); - } - if (!Objects.isNull(newTableColumn.getDefaultValue())) { - sqlColumnDefinition.setDefaultExpr(new MySqlCharExpr(newTableColumn.getDefaultValue())); - } - sqlColumnDefinition.setAutoIncrement(BooleanUtils.isTrue(newTableColumn.getAutoIncrement())); - if (!Objects.isNull(newTableColumn.getComment())) { - sqlColumnDefinition.setComment(newTableColumn.getComment()); - } - return; - } - // 代表可能修改字段 或者没变 - boolean hasChange = !StringUtils.equals(oldTableColumn.getName(), newTableColumn.getName()) - || !StringUtils.equals(oldTableColumn.getColumnType(), newTableColumn.getColumnType()) - || !EasyIntegerUtils.equals(oldTableColumn.getNullable(), newTableColumn.getNullable(), 1) - || !StringUtils.equals(oldTableColumn.getDefaultValue(), newTableColumn.getDefaultValue()) - || !EasyBooleanUtils.equals(oldTableColumn.getAutoIncrement(), newTableColumn.getAutoIncrement(), - Boolean.FALSE) - || !StringUtils.equals(oldTableColumn.getComment(), newTableColumn.getComment()); - - // 没有修改字段 - if (!hasChange) { - return; - } - - // 修改字段包含字段名 - if (!StringUtils.equals(oldTableColumn.getName(), newTableColumn.getName())) { - MySqlAlterTableChangeColumn mySqlAlterTableChangeColumn = new MySqlAlterTableChangeColumn(); - sqlAlterTableStatement.addItem(mySqlAlterTableChangeColumn); - mySqlAlterTableChangeColumn.setColumnName(new SQLIdentifierExpr(newTableColumn.getOldName())); - SQLColumnDefinition sqlColumnDefinition = new SQLColumnDefinition(); - mySqlAlterTableChangeColumn.setNewColumnDefinition(sqlColumnDefinition); - sqlColumnDefinition.setName(newTableColumn.getName()); - sqlColumnDefinition.setDataType(new SQLDataTypeImpl(newTableColumn.getColumnType())); - if (newTableColumn.getNullable() != 1) { - sqlColumnDefinition.addConstraint(new SQLNotNullConstraint()); - } - if (!Objects.isNull(newTableColumn.getDefaultValue())) { - sqlColumnDefinition.setDefaultExpr(new MySqlCharExpr(newTableColumn.getDefaultValue())); - } - sqlColumnDefinition.setAutoIncrement(BooleanUtils.isTrue(newTableColumn.getAutoIncrement())); - if (!Objects.isNull(newTableColumn.getComment())) { - sqlColumnDefinition.setComment(newTableColumn.getComment()); - } - } else { - // 修改字段不包括字段名 - MySqlAlterTableModifyColumn mySqlAlterTableModifyColumn = new MySqlAlterTableModifyColumn(); - sqlAlterTableStatement.addItem(mySqlAlterTableModifyColumn); - SQLColumnDefinition sqlColumnDefinition = new SQLColumnDefinition(); - mySqlAlterTableModifyColumn.setNewColumnDefinition(sqlColumnDefinition); - sqlColumnDefinition.setName(newTableColumn.getName()); - sqlColumnDefinition.setDataType(new SQLDataTypeImpl(newTableColumn.getColumnType())); - if (newTableColumn.getNullable() != 1) { - sqlColumnDefinition.addConstraint(new SQLNotNullConstraint()); - } - if (!Objects.isNull(newTableColumn.getDefaultValue())) { - sqlColumnDefinition.setDefaultExpr(new MySqlCharExpr(newTableColumn.getDefaultValue())); - } - sqlColumnDefinition.setAutoIncrement(BooleanUtils.isTrue(newTableColumn.getAutoIncrement())); - if (!Objects.isNull(newTableColumn.getComment())) { - sqlColumnDefinition.setComment(newTableColumn.getComment()); - } - } - }); - - oldColumnMap.forEach((oldTableColumnName, oldTableColumn) -> { - TableColumn newTableColumn = newColumnMap.get(oldTableColumnName); - // 代表删除字段 - if (newTableColumn == null) { - SQLAlterTableDropColumnItem sqlAlterTableDropColumnItem = new SQLAlterTableDropColumnItem(); - sqlAlterTableStatement.addItem(sqlAlterTableDropColumnItem); - sqlAlterTableDropColumnItem.addColumn(new SQLIdentifierExpr(oldTableColumn.getName())); - } - }); - - // 比较主键是否有修改 - // 主键 - Set oldPrimaryKeySet = EasyCollectionUtils.stream(oldTable.getColumnList()) - .filter(tableColumn -> BooleanUtils.isTrue(tableColumn.getPrimaryKey())) - .map(TableColumn::getName) - .collect(Collectors.toSet()); - Set newPrimaryKeySet = EasyCollectionUtils.stream(newTable.getColumnList()) - .filter(tableColumn -> BooleanUtils.isTrue(tableColumn.getPrimaryKey())) - .map(TableColumn::getName) - .collect(Collectors.toSet()); - boolean primaryKeyChange = oldPrimaryKeySet.stream() - .anyMatch(oldPrimaryKey -> !newPrimaryKeySet.contains(oldPrimaryKey)) - || newPrimaryKeySet.stream() - .anyMatch(newPrimaryKey -> !oldPrimaryKeySet.contains(newPrimaryKey)); - if (primaryKeyChange) { - sqlAlterTableStatement.addItem(new SQLAlterTableDropPrimaryKey()); - SQLAlterTableAddConstraint sqlAlterTableAddConstraint = new SQLAlterTableAddConstraint(); - sqlAlterTableStatement.addItem(sqlAlterTableAddConstraint); - MySqlPrimaryKey mySqlPrimaryKey = new MySqlPrimaryKey(); - sqlAlterTableAddConstraint.setConstraint(mySqlPrimaryKey); - mySqlPrimaryKey.setIndexType("PRIMARY"); - // 排序 - EasyCollectionUtils.stream(newTable.getColumnList()) - .filter(tableColumn -> BooleanUtils.isTrue(tableColumn.getPrimaryKey())) - .map(TableColumn::getName) - .forEach(tableColumnName -> mySqlPrimaryKey.addColumn( - new SQLSelectOrderByItem(new SQLIdentifierExpr(tableColumnName)))); - } - - if (CollectionUtils.isNotEmpty(sqlAlterTableStatement.getItems())) { - sqlList.add(Sql.builder().sql(sqlAlterTableStatement + ";").build()); + executeResult.setCanEdit(false); } } - private static void modifyIndex(List sqlList, Table oldTable, Table newTable) { - Map oldIndexMap = EasyCollectionUtils.toIdentityMap(oldTable.getIndexList(), - TableIndex::getName); - Map newIndexMap = EasyCollectionUtils.toIdentityMap(newTable.getIndexList(), - TableIndex::getName); - newIndexMap.forEach((newTableIndexName, newTableIndex) -> { - TableIndex oldTableIndex = oldIndexMap.get(newTableIndexName); - // 代表新增索引 - if (oldTableIndex == null) { - SQLCreateIndexStatement sqlCreateIndexStatement = new SQLCreateIndexStatement(); - sqlCreateIndexStatement.setTable(new SQLExprTableSource(newTable.getName())); - sqlCreateIndexStatement.setName(new SQLIdentifierExpr(newTableIndex.getName())); - if (!Objects.isNull(newTableIndex.getComment())) { - sqlCreateIndexStatement.setComment(new SQLCharExpr(newTableIndex.getComment())); - } - if (!CollectionUtils.isEmpty(newTableIndex.getColumnList())) { - for (TableIndexColumn tableIndexColumn : newTableIndex.getColumnList()) { - SQLSelectOrderByItem sqlSelectOrderByItem = new SQLSelectOrderByItem(); - sqlSelectOrderByItem.setExpr(new SQLIdentifierExpr(tableIndexColumn.getColumnName())); - CollationEnum collation = EasyEnumUtils.getEnum(CollationEnum.class, - tableIndexColumn.getCollation()); - if (collation != null) { - sqlSelectOrderByItem.setType(collation.getSqlOrderingSpecification()); - } - sqlCreateIndexStatement.getColumns().add(sqlSelectOrderByItem); - } - } - sqlList.add(Sql.builder().sql(sqlCreateIndexStatement + ";").build()); - return; - } - // 代表可能修改索引 或者没变 - boolean hasChange = !StringUtils.equals(oldTableIndex.getName(), newTableIndex.getName()) - || !StringUtils.equals(oldTableIndex.getComment(), newTableIndex.getComment()) - || !Objects.equals(oldTableIndex.getUnique(), newTableIndex.getUnique()); - if (!hasChange) { - Map oldTableIndexColumnMap = EasyCollectionUtils.toIdentityMap( - oldTableIndex.getColumnList(), TableIndexColumn::getColumnName); - Map newTableIndexColumnMap = EasyCollectionUtils.toIdentityMap( - newTableIndex.getColumnList(), TableIndexColumn::getColumnName); - hasChange = oldTableIndexColumnMap.entrySet() - .stream() - .anyMatch(oldTableIndexColumnEntry -> { - TableIndexColumn newTableIndexColumn = newTableIndexColumnMap.get( - oldTableIndexColumnEntry.getKey()); - if (newTableIndexColumn == null) { - return true; - } - TableIndexColumn oldTableIndexColumn = oldTableIndexColumnEntry.getValue(); - return !StringUtils.equals(oldTableIndexColumn.getColumnName(), - newTableIndexColumn.getColumnName()) - || !CollationEnum.equals(oldTableIndexColumn.getCollation(), - newTableIndexColumn.getCollation()); - }) - || newTableIndexColumnMap.entrySet() - .stream() - .anyMatch(newTableIndexColumnEntry -> { - TableIndexColumn oldTableIndexColumn = oldTableIndexColumnMap.get( - newTableIndexColumnEntry.getKey()); - return oldTableIndexColumn == null; - }); - } - - // 没有修改索引 - if (!hasChange) { - return; - } - // 先删除 - SQLDropIndexStatement sqlDropIndexStatement = new SQLDropIndexStatement(); - sqlDropIndexStatement.setDbType(DbType.mysql); - sqlDropIndexStatement.setTableName(new SQLExprTableSource(newTable.getName())); - sqlDropIndexStatement.setIndexName(new SQLIdentifierExpr(newTableIndex.getName())); - sqlList.add(Sql.builder().sql(sqlDropIndexStatement + ";").build()); - - // 再新增 - SQLCreateIndexStatement sqlCreateIndexStatement = new SQLCreateIndexStatement(); - sqlCreateIndexStatement.setTable(new SQLExprTableSource(newTable.getName())); - sqlCreateIndexStatement.setName(new SQLIdentifierExpr(newTableIndex.getName())); - if (!Objects.isNull(newTableIndex.getComment())) { - sqlCreateIndexStatement.setComment(new SQLCharExpr(newTableIndex.getComment())); - } - if (!CollectionUtils.isEmpty(newTableIndex.getColumnList())) { - for (TableIndexColumn tableIndexColumn : newTableIndex.getColumnList()) { - SQLSelectOrderByItem sqlSelectOrderByItem = new SQLSelectOrderByItem(); - sqlSelectOrderByItem.setExpr(new SQLIdentifierExpr(tableIndexColumn.getColumnName())); - CollationEnum collation = EasyEnumUtils.getEnum(CollationEnum.class, - tableIndexColumn.getCollation()); - if (collation != null) { - sqlSelectOrderByItem.setType(collation.getSqlOrderingSpecification()); - } - sqlCreateIndexStatement.getColumns().add(sqlSelectOrderByItem); - } - } - sqlList.add(Sql.builder().sql(sqlCreateIndexStatement + ";").build()); - }); - - oldIndexMap.forEach((oldTableIndexName, oldTableIndex) -> { - TableIndex newTableIndex = newIndexMap.get(oldTableIndexName); - // 代表删除索引 - if (newTableIndex == null) { - SQLDropIndexStatement sqlDropIndexStatement = new SQLDropIndexStatement(); - sqlDropIndexStatement.setDbType(DbType.mysql); - sqlDropIndexStatement.setTableName(new SQLExprTableSource(newTable.getName())); - sqlDropIndexStatement.setIndexName(new SQLIdentifierExpr(oldTableIndex.getName())); - sqlList.add(Sql.builder().sql(sqlDropIndexStatement + ";").build()); - } - }); + private static String getMetaDataTableName(String... names) { + return Arrays.stream(names).filter(name -> StringUtils.isNotBlank(name)).map(name -> name ).collect(Collectors.joining(".")); } public static String formatSQLString(Object para) { @@ -511,7 +110,7 @@ public class SqlUtils { } public static String getSqlValue(String value, String dataType) { - if(value == null){ + if (value == null) { return null; } DataTypeEnum dataTypeEnum = DataTypeEnum.getByCode(dataType);