From d7667c6f82d1262c739ad4f27a8d57d6562a79f8 Mon Sep 17 00:00:00 2001 From: tmlx1990 Date: Thu, 11 Apr 2024 18:29:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?MySQL=E7=A7=BB=E5=8A=A8=E5=88=97=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D=E3=80=82=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=B7=A8=E5=A4=9A=E8=BF=9E=E7=BB=AD=E6=95=B0=E6=8D=AE=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E4=B8=8D=E8=83=BD=E8=AF=86=E5=88=AB=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mysql/builder/MysqlSqlBuilder.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) 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..1f1b6fd1 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 @@ -177,7 +177,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); sql.append(" MODIFY COLUMN "); MysqlColumnTypeEnum typeEnum = MysqlColumnTypeEnum.getByType(column.getColumnType()); sql.append(typeEnum.buildColumn(column)); @@ -201,7 +201,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); if (n > 0) { sql.append("ALTER TABLE "); if (StringUtils.isNotBlank(oldTable.getDatabaseName())) { @@ -257,7 +257,7 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { sql.append(";\n"); n++; - String[] newArray = moveElement(originalArray, i, a); + String[] newArray = moveElement(originalArray, i, a, targetArray); if (Arrays.equals(newArray, targetArray)) { return newArray; } @@ -280,20 +280,41 @@ 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) { String[] newArray = new String[originalArray.length]; System.arraycopy(originalArray, 0, newArray, 0, originalArray.length); String temp = newArray[from]; + // 是否有连续移动数据 + boolean isContinuousData = false; + // 连续数据数量 + int continuousDataCount = 0; 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++; + } else { + break; + } + } + if (continuousDataCount > 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] = temp; + } else { + newArray[to] = temp; + } return newArray; } From 9d2af9c6e2f18deda0b71c7798323765027f8ada Mon Sep 17 00:00:00 2001 From: tmlx1990 Date: Fri, 12 Apr 2024 11:47:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?MySQL=E7=A7=BB=E5=8A=A8=E5=88=97=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D=E3=80=82=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=B7=A8=E5=A4=9A=E8=BF=9E=E7=BB=AD=E6=95=B0=E6=8D=AE=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E4=B8=8D=E8=83=BD=E8=AF=86=E5=88=AB=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/mysql/builder/MysqlSqlBuilder.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) 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 1f1b6fd1..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, targetArray); + 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, targetArray); + 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, targetArray); + if (Arrays.equals(newArray, targetArray)) { return newArray; } @@ -285,23 +288,22 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { || (i > 0 && a > 0 && !originalArray[i - 1].equals(targetArray[a - 1])); } - private static String[] moveElement(String[] originalArray, int from, int to, String[] targetArray) { + 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; // 连续数据数量 - int continuousDataCount = 0; if (from < to) { for (int i = to; i < originalArray.length - 1; i++) { if (originalArray[i+1].equals(targetArray[findIndex(targetArray, originalArray[i]) +1])) { - continuousDataCount++; + continuousDataCount.set(continuousDataCount.incrementAndGet()); } else { break; } } - if (continuousDataCount > 0) { + if (continuousDataCount.get() > 0) { System.arraycopy(originalArray, from + 1, newArray, from, to - from +1); isContinuousData = true; } else { @@ -311,7 +313,7 @@ public class MysqlSqlBuilder extends DefaultSqlBuilder { System.arraycopy(originalArray, to, newArray, to + 1, from - to); } if (isContinuousData){ - newArray[to+continuousDataCount] = temp; + newArray[to+continuousDataCount.get()] = temp; } else { newArray[to] = temp; }