Merge pull request #1299 from tmlx1990/pro

fixed MySQL column movement problem
This commit is contained in:
Chat2DB
2024-04-16 15:12:39 +08:00
committed by GitHub

View File

@ -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;
}