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 1b84c41b..4ff06797 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 @@ -12,6 +12,7 @@ import cn.hutool.core.util.ArrayUtil; import org.apache.commons.lang3.StringUtils; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; public class MysqlSqlBuilder extends DefaultSqlBuilder { @@ -177,7 +178,7 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { if (!originalArray[0].equals(targetArray[0])) { int a = findIndex(originalArray, targetArray[0]); TableColumn column = oldTable.getColumnList().stream().filter(col -> StringUtils.equals(col.getName(), originalArray[a])).findFirst().get(); - String[] newArray = moveElement(originalArray, a, 0); + String[] newArray = moveElement(originalArray, a, 0, targetArray, new AtomicInteger(0)); sql.append(" MODIFY COLUMN "); MysqlColumnTypeEnum typeEnum = MysqlColumnTypeEnum.getByType(column.getColumnType()); sql.append(typeEnum.buildColumn(column)); @@ -201,7 +202,7 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { int a = findIndex(originalArray, targetArray[max]); //System.out.println("Move " + originalArray[a] + " after " + (a > 0 ? originalArray[max] : "start")); TableColumn column = oldTable.getColumnList().stream().filter(col -> StringUtils.equals(col.getName(), originalArray[a])).findFirst().get(); - String[] newArray = moveElement(originalArray, a, max); + String[] newArray = moveElement(originalArray, a, max, targetArray, new AtomicInteger(0)); if (n > 0) { sql.append("ALTER TABLE "); if (StringUtils.isNotBlank(oldTable.getDatabaseName())) { @@ -249,15 +250,17 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { sql.append(" COMMENT '").append(column.getComment()).append("'"); } sql.append(" AFTER "); + AtomicInteger continuousDataCount = new AtomicInteger(0); + String[] newArray = moveElement(originalArray, i, a, targetArray, continuousDataCount); if (i < a) { - sql.append(originalArray[a]); + sql.append(originalArray[a + continuousDataCount.get()]); } else { sql.append(originalArray[a - 1]); } sql.append(";\n"); n++; - String[] newArray = moveElement(originalArray, i, a); + if (Arrays.equals(newArray, targetArray)) { return newArray; } @@ -280,20 +283,40 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { } private static boolean isMoveValid(String[] originalArray, String[] targetArray, int i, int a) { - return (i == 0 || a == 0 || !originalArray[i - 1].equals(targetArray[a - 1])) && - (i >= originalArray.length - 1 || a >= targetArray.length - 1 || !originalArray[i + 1].equals(targetArray[a + 1])); + return ((i == 0 || a == 0 || !originalArray[i - 1].equals(targetArray[a - 1])) && + (i >= originalArray.length - 1 || a >= targetArray.length - 1 || !originalArray[i + 1].equals(targetArray[a + 1]))) + || (i > 0 && a > 0 && !originalArray[i - 1].equals(targetArray[a - 1])); } - private static String[] moveElement(String[] originalArray, int from, int to) { + private static String[] moveElement(String[] originalArray, int from, int to, String[] targetArray, AtomicInteger continuousDataCount) { String[] newArray = new String[originalArray.length]; System.arraycopy(originalArray, 0, newArray, 0, originalArray.length); String temp = newArray[from]; + // 是否有连续移动数据 + boolean isContinuousData = false; + // 连续数据数量 if (from < to) { - System.arraycopy(originalArray, from + 1, newArray, from, to - from); + for (int i = to; i < originalArray.length - 1; i++) { + if (originalArray[i+1].equals(targetArray[findIndex(targetArray, originalArray[i]) +1])) { + continuousDataCount.set(continuousDataCount.incrementAndGet()); + } else { + break; + } + } + if (continuousDataCount.get() > 0) { + System.arraycopy(originalArray, from + 1, newArray, from, to - from +1); + isContinuousData = true; + } else { + System.arraycopy(originalArray, from + 1, newArray, from, to - from); + } } else { System.arraycopy(originalArray, to, newArray, to + 1, from - to); } - newArray[to] = temp; + if (isContinuousData){ + newArray[to+continuousDataCount.get()] = temp; + } else { + newArray[to] = temp; + } return newArray; }