From fb229b21e641d41b19bf839f486687fe97c09254 Mon Sep 17 00:00:00 2001 From: tmlx1990 Date: Tue, 28 May 2024 00:53:10 +0800 Subject: [PATCH] =?UTF-8?q?mysql=E4=BF=AE=E6=94=B9=E5=88=97=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mysql/builder/MysqlSqlBuilder.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/builder/MysqlSqlBuilder.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/builder/MysqlSqlBuilder.java index dc27b5af..3f93993d 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/builder/MysqlSqlBuilder.java +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/builder/MysqlSqlBuilder.java @@ -93,6 +93,19 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { script.append("\t").append("AUTO_INCREMENT=").append(newTable.getIncrementValue()).append(",\n"); } + // 判断是否有删除字段、新增字段及字段位置移动 + // 判断新增字段 + List addColumnList = new ArrayList<>(); + for (TableColumn tableColumn : newTable.getColumnList()) { + if (tableColumn.getEditStatus() != null ? tableColumn.getEditStatus().equals("ADD") : false) { + addColumnList.add(tableColumn); + } + } + + // 判断移动的字段 + List moveColumnList = new ArrayList<>(); + movedElements(oldTable.getColumnList(), newTable.getColumnList()); + // append modify column for (TableColumn tableColumn : newTable.getColumnList()) { if (StringUtils.isNotBlank(tableColumn.getEditStatus()) && StringUtils.isNotBlank(tableColumn.getColumnType()) && StringUtils.isNotBlank(tableColumn.getName())) { @@ -110,7 +123,7 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { } // append reorder column - script.append(buildGenerateReorderColumnSql(oldTable, newTable)); + // script.append(buildGenerateReorderColumnSql(oldTable, newTable)); if (script.length() > 2) { script = new StringBuilder(script.substring(0, script.length() - 2)); @@ -151,6 +164,47 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { return sqlBuilder.toString(); } + public static List movedElements(List original, List modified) { + int[][] dp = new int[original.size() + 1][modified.size() + 1]; + + // 构建DP表 + for (int i = 1; i <= original.size(); i++) { + for (int j = 1; j <= modified.size(); j++) { + if (original.get(i - 1).getName().equals(modified.get(j - 1).getOldName())) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } else { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + } + } + } + + // 追踪LCS,找出移动了位置的元素 + List moved = new ArrayList<>(); + int i = original.size(); + int j = modified.size(); + while (i > 0 && j > 0) { + if (original.get(i - 1).equals(modified.get(j - 1))) { + i--; + j--; + } else if (dp[i - 1][j] >= dp[i][j - 1]) { + moved.add(original.get(i - 1)); + // modified List中找到original.get(i-1)的位置 + System.out.println("Moved elements:"+ original.get(i-1).getName() + " after " + modified.indexOf(original.get(i-1)) ); + i--; + } else { + j--; + } + } + + // 这里添加原始列表中未被包含在LCS中的元素 + while (i > 0) { + moved.add(original.get(i - 1)); + i--; + } + + return moved; + } + public String buildGenerateReorderColumnSql(Table oldTable, Table newTable) { StringBuilder sql = new StringBuilder(); int n = 0;