Skip to content

Commit a188531

Browse files
authored
Merge branch 'chat2db:main' into main
2 parents 640ab10 + 64af642 commit a188531

File tree

181 files changed

+8181
-1540
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

181 files changed

+8181
-1540
lines changed

chat2db-server/chat2db-plugins/chat2db-clickhouse/src/main/java/ai/chat2db/plugin/clickhouse/ClickHouseDBManage.java

+26-9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import ai.chat2db.spi.DBManage;
44
import ai.chat2db.spi.jdbc.DefaultDBManage;
5+
import ai.chat2db.spi.model.AsyncContext;
56
import ai.chat2db.spi.sql.ConnectInfo;
67
import ai.chat2db.spi.sql.SQLExecutor;
78
import org.apache.commons.lang3.StringUtils;
@@ -11,43 +12,50 @@
1112

1213
public class ClickHouseDBManage extends DefaultDBManage implements DBManage {
1314
@Override
14-
public String exportDatabase(Connection connection, String databaseName, String schemaName, boolean containData) throws SQLException {
15-
StringBuilder sqlBuilder = new StringBuilder();
16-
exportTablesOrViewsOrDictionaries(connection, sqlBuilder, databaseName, schemaName,containData);
17-
exportFunctions(connection, sqlBuilder);
18-
return sqlBuilder.toString();
15+
public void exportDatabase(Connection connection, String databaseName, String schemaName, AsyncContext asyncContext) throws SQLException {
16+
exportTablesOrViewsOrDictionaries(connection, databaseName, schemaName,asyncContext);
17+
exportFunctions(connection, asyncContext);
1918
}
2019

21-
private void exportFunctions(Connection connection, StringBuilder sqlBuilder) throws SQLException {
20+
private void exportFunctions(Connection connection, AsyncContext asyncContext) throws SQLException {
2221
String sql ="SELECT name,create_query from system.functions where origin='SQLUserDefined'";
2322
try(ResultSet resultSet=connection.createStatement().executeQuery(sql)){
2423
while (resultSet.next()) {
24+
StringBuilder sqlBuilder = new StringBuilder();
2525
sqlBuilder.append("DROP FUNCTION IF EXISTS ").append(resultSet.getString("name")).append(";")
2626
.append("\n")
2727
.append(resultSet.getString("create_query")).append(";").append("\n");
28+
asyncContext.write(sqlBuilder.toString());
2829
}
2930
}
3031
}
3132

32-
private void exportTablesOrViewsOrDictionaries(Connection connection, StringBuilder sqlBuilder, String databaseName, String schemaName, boolean containData) throws SQLException {
33+
private void exportTablesOrViewsOrDictionaries(Connection connection,String databaseName, String schemaName, AsyncContext asyncContext) throws SQLException {
3334
String sql =String.format("SELECT create_table_query, has_own_data,engine,name from system.`tables` WHERE `database`='%s'", databaseName);
3435
try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) {
3536
while (resultSet.next()) {
37+
3638
String ddl = resultSet.getString("create_table_query");
3739
boolean dataFlag = resultSet.getInt("has_own_data") == 1;
3840
String tableType = resultSet.getString("engine");
3941
String tableOrViewName = resultSet.getString("name");
4042
if (Objects.equals("View", tableType)) {
43+
StringBuilder sqlBuilder = new StringBuilder();
4144
sqlBuilder.append("DROP VIEW IF EXISTS ").append(databaseName).append(".").append(tableOrViewName)
4245
.append(";").append("\n").append(ddl).append(";").append("\n");
46+
asyncContext.write(sqlBuilder.toString());
4347
} else if (Objects.equals("Dictionary", tableType)) {
48+
StringBuilder sqlBuilder = new StringBuilder();
4449
sqlBuilder.append("DROP DICTIONARY IF EXISTS ").append(databaseName).append(".").append(tableOrViewName)
4550
.append(";").append("\n").append(ddl).append(";").append("\n");
51+
asyncContext.write(sqlBuilder.toString());
4652
} else {
53+
StringBuilder sqlBuilder = new StringBuilder();
4754
sqlBuilder.append("DROP TABLE IF EXISTS ").append(databaseName).append(".").append(tableOrViewName)
4855
.append(";").append("\n").append(ddl).append(";").append("\n");
49-
if (containData && dataFlag) {
50-
exportTableData(connection,schemaName, tableOrViewName, sqlBuilder);
56+
asyncContext.write(sqlBuilder.toString());
57+
if (asyncContext.isContainsData() && dataFlag) {
58+
exportTableData(connection, databaseName,schemaName, tableOrViewName, asyncContext);
5159
}
5260
}
5361
}
@@ -88,4 +96,13 @@ public void dropTable(Connection connection, String databaseName, String schemaN
8896
}
8997

9098

99+
@Override
100+
public void copyTable(Connection connection, String databaseName, String schemaName, String tableName, String newTableName,boolean copyData) throws SQLException {
101+
String sql = "CREATE TABLE " + newTableName + " AS " + tableName + "";
102+
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
103+
if(copyData){
104+
sql = "INSERT INTO " + newTableName + " SELECT * FROM " + tableName;
105+
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
106+
}
107+
}
91108
}

chat2db-server/chat2db-plugins/chat2db-clickhouse/src/main/java/ai/chat2db/plugin/clickhouse/ClickHouseMetaData.java

+7-10
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public List<Function> functions(Connection connection, String databaseName, Stri
6161

6262
@Override
6363
public List<Database> databases(Connection connection) {
64-
List<Database> list = SQLExecutor.getInstance().execute(connection, "SELECT name FROM system.databases;;", resultSet -> {
64+
List<Database> list = SQLExecutor.getInstance().execute(connection, "SELECT name FROM system.databases;", resultSet -> {
6565
List<Database> databases = new ArrayList<>();
6666
try {
6767
while (resultSet.next()) {
@@ -81,7 +81,7 @@ public List<Database> databases(Connection connection) {
8181
@Override
8282
public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName,
8383
@NotEmpty String tableName) {
84-
String sql = "SHOW CREATE TABLE " + format(databaseName) + "."
84+
String sql = "SHOW CREATE TABLE " + format(schemaName) + "."
8585
+ format(tableName);
8686
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
8787
if (resultSet.next()) {
@@ -112,7 +112,7 @@ public Function function(Connection connection, @NotEmpty String databaseName, S
112112
@Override
113113
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
114114
List<Trigger> triggers = new ArrayList<>();
115-
String sql = String.format(TRIGGER_SQL_LIST, databaseName);
115+
String sql = String.format(TRIGGER_SQL_LIST, schemaName);
116116
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
117117
while (resultSet.next()) {
118118
Trigger trigger = new Trigger();
@@ -145,7 +145,7 @@ public Trigger trigger(Connection connection, @NotEmpty String databaseName, Str
145145
@Override
146146
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
147147
String procedureName) {
148-
String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName);
148+
String sql = String.format(ROUTINES_SQL, "PROCEDURE", schemaName, procedureName);
149149
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
150150
Procedure procedure = new Procedure();
151151
procedure.setDatabaseName(databaseName);
@@ -235,7 +235,7 @@ public Table view(Connection connection, String databaseName, String schemaName,
235235
@Override
236236
public List<TableIndex> indexes(Connection connection, String databaseName, String schemaName, String tableName) {
237237
StringBuilder queryBuf = new StringBuilder("SHOW INDEX FROM ");
238-
queryBuf.append("`").append(tableName).append("`");
238+
queryBuf.append("`").append(schemaName).append("`");
239239
queryBuf.append(" FROM ");
240240
queryBuf.append("`").append(databaseName).append("`");
241241
return SQLExecutor.getInstance().execute(connection, queryBuf.toString(), resultSet -> {
@@ -298,11 +298,8 @@ public TableMeta getTableMeta(String databaseName, String schemaName, String tab
298298

299299
@Override
300300
public String getMetaDataName(String... names) {
301-
return Arrays.stream(names)
302-
.skip(1) // 跳过第一个名称
303-
.filter(StringUtils::isNotBlank)
304-
.map(name -> "`" + name + "`")
305-
.collect(Collectors.joining("."));
301+
return Arrays.stream(names).filter(name -> StringUtils.isNotBlank(name)).map(name -> "`" + name + "`").collect(Collectors.joining("."));
302+
306303
}
307304

308305

chat2db-server/chat2db-plugins/chat2db-clickhouse/src/main/java/ai/chat2db/plugin/clickhouse/builder/ClickHouseSqlBuilder.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ public String buildCreateTableSql(Table table) {
2727
continue;
2828
}
2929
ClickHouseColumnTypeEnum typeEnum = ClickHouseColumnTypeEnum.getByType(column.getColumnType());
30+
if (typeEnum != null){
31+
continue;
32+
}
3033
script.append("\t").append(typeEnum.buildCreateColumnSql(column)).append(",\n");
3134
}
3235

@@ -85,16 +88,22 @@ public String buildModifyTaleSql(Table oldTable, Table newTable) {
8588
for (TableColumn tableColumn : newTable.getColumnList()) {
8689
if (StringUtils.isNotBlank(tableColumn.getEditStatus()) && StringUtils.isNotBlank(tableColumn.getColumnType()) && StringUtils.isNotBlank(tableColumn.getName())) {
8790
ClickHouseColumnTypeEnum typeEnum = ClickHouseColumnTypeEnum.getByType(tableColumn.getColumnType());
91+
if(typeEnum == null){
92+
continue;
93+
}
8894
script.append("\t").append(typeEnum.buildModifyColumn(tableColumn)).append(",\n");
8995
}
9096
}
9197

9298
// append modify index
9399
for (TableIndex tableIndex : newTable.getIndexList()) {
94100
if (StringUtils.isNotBlank(tableIndex.getEditStatus()) && StringUtils.isNotBlank(tableIndex.getType())) {
95-
ClickHouseIndexTypeEnum mysqlIndexTypeEnum = ClickHouseIndexTypeEnum
101+
ClickHouseIndexTypeEnum clickHouseIndexTypeEnum = ClickHouseIndexTypeEnum
96102
.getByType(tableIndex.getType());
97-
script.append("\t").append(mysqlIndexTypeEnum.buildModifyIndex(tableIndex)).append(",\n");
103+
if(clickHouseIndexTypeEnum == null){
104+
continue;
105+
}
106+
script.append("\t").append(clickHouseIndexTypeEnum.buildModifyIndex(tableIndex)).append(",\n");
98107
}
99108
}
100109

chat2db-server/chat2db-plugins/chat2db-clickhouse/src/main/java/ai/chat2db/plugin/clickhouse/type/ClickHouseColumnTypeEnum.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ai.chat2db.spi.enums.EditStatus;
55
import ai.chat2db.spi.model.ColumnType;
66
import ai.chat2db.spi.model.TableColumn;
7+
import ai.chat2db.spi.util.SqlUtils;
78
import com.google.common.collect.Maps;
89
import org.apache.commons.lang3.StringUtils;
910

@@ -67,7 +68,7 @@ public enum ClickHouseColumnTypeEnum implements ColumnBuilder {
6768
}
6869

6970
public static ClickHouseColumnTypeEnum getByType(String dataType) {
70-
return COLUMN_TYPE_MAP.get(dataType);
71+
return COLUMN_TYPE_MAP.get(SqlUtils.removeDigits(dataType.toUpperCase()));
7172
}
7273

7374
public static List<ColumnType> getTypes() {

chat2db-server/chat2db-plugins/chat2db-db2/src/main/java/ai/chat2db/plugin/db2/DB2DBManage.java

+32-15
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import ai.chat2db.plugin.db2.constant.SQLConstant;
44
import ai.chat2db.spi.DBManage;
55
import ai.chat2db.spi.jdbc.DefaultDBManage;
6+
import ai.chat2db.spi.model.AsyncContext;
67
import ai.chat2db.spi.sql.Chat2DBContext;
78
import ai.chat2db.spi.sql.ConnectInfo;
89
import ai.chat2db.spi.sql.SQLExecutor;
@@ -18,25 +19,23 @@
1819
public class DB2DBManage extends DefaultDBManage implements DBManage {
1920

2021
@Override
21-
public String exportDatabase(Connection connection, String databaseName, String schemaName, boolean containData) throws SQLException {
22-
StringBuilder sqlBuilder = new StringBuilder();
23-
exportTables(connection, schemaName, sqlBuilder, containData);
24-
exportViews(connection, schemaName, sqlBuilder);
25-
exportProceduresAndFunctions(connection, schemaName, sqlBuilder);
26-
exportTriggers(connection, schemaName, sqlBuilder);
27-
return sqlBuilder.toString();
22+
public void exportDatabase(Connection connection, String databaseName, String schemaName, AsyncContext asyncContext) throws SQLException {
23+
exportTables(connection, databaseName, schemaName, asyncContext);
24+
exportViews(connection, schemaName, asyncContext);
25+
exportProceduresAndFunctions(connection, schemaName, asyncContext);
26+
exportTriggers(connection, schemaName, asyncContext);
2827
}
2928

30-
private void exportTables(Connection connection, String schemaName, StringBuilder sqlBuilder, boolean containData) throws SQLException {
29+
private void exportTables(Connection connection, String databaseName, String schemaName, AsyncContext asyncContext) throws SQLException {
3130
try (ResultSet resultSet = connection.getMetaData().getTables(null, schemaName, null, new String[]{"TABLE", "SYSTEM TABLE"})) {
3231
while (resultSet.next()) {
33-
exportTable(connection, schemaName, resultSet.getString("TABLE_NAME"), sqlBuilder, containData);
32+
exportTable(connection, databaseName, schemaName, resultSet.getString("TABLE_NAME"), asyncContext);
3433
}
3534
}
3635
}
3736

3837

39-
private void exportTable(Connection connection, String schemaName, String tableName, StringBuilder sqlBuilder, boolean containData) throws SQLException {
38+
public void exportTable(Connection connection, String databaseName, String schemaName, String tableName, AsyncContext asyncContext) throws SQLException {
4039
try {
4140
SQLExecutor.getInstance().execute(connection, SQLConstant.TABLE_DDL_FUNCTION_SQL, resultSet -> null);
4241
} catch (Exception e) {
@@ -45,42 +44,50 @@ private void exportTable(Connection connection, String schemaName, String tableN
4544
String sql = String.format("select %s.GENERATE_TABLE_DDL('%s', '%s') as sql from %s;", schemaName, schemaName, tableName, tableName);
4645
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
4746
if (resultSet.next()) {
47+
StringBuilder sqlBuilder = new StringBuilder();
4848
sqlBuilder.append(resultSet.getString("sql")).append("\n");
49-
if (containData) {
50-
exportTableData(connection, schemaName, tableName, sqlBuilder);
49+
asyncContext.write(sqlBuilder.toString());
50+
if (asyncContext.isContainsData()) {
51+
exportTableData(connection, databaseName, schemaName, tableName, asyncContext);
5152
}
5253
}
5354
}
5455
}
5556

5657

57-
private void exportViews(Connection connection, String schemaName, StringBuilder sqlBuilder) throws SQLException {
58+
private void exportViews(Connection connection, String schemaName, AsyncContext asyncContext) throws SQLException {
5859
String sql = String.format("select TEXT from syscat.views where VIEWSCHEMA='%s';", schemaName);
5960
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
6061
while (resultSet.next()) {
62+
StringBuilder sqlBuilder = new StringBuilder();
6163
String ddl = resultSet.getString("TEXT");
6264
sqlBuilder.append(ddl).append(";").append("\n");
65+
asyncContext.write(sqlBuilder.toString());
6366
}
6467
}
6568
}
6669

67-
private void exportProceduresAndFunctions(Connection connection, String schemaName, StringBuilder sqlBuilder) throws SQLException {
70+
private void exportProceduresAndFunctions(Connection connection, String schemaName, AsyncContext asyncContext) throws SQLException {
6871
String sql = String.format("select TEXT from syscat.routines where ROUTINESCHEMA='%s';", schemaName);
6972
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
7073
while (resultSet.next()) {
74+
StringBuilder sqlBuilder = new StringBuilder();
7175
String ddl = resultSet.getString("TEXT");
7276
sqlBuilder.append(ddl).append(";").append("\n");
77+
asyncContext.write(sqlBuilder.toString());
7378
}
7479
}
7580
}
7681

7782

78-
private void exportTriggers(Connection connection, String schemaName, StringBuilder sqlBuilder) throws SQLException {
83+
private void exportTriggers(Connection connection, String schemaName, AsyncContext asyncContext) throws SQLException {
7984
String sql = String.format("select * from SYSCAT.TRIGGERS where TRIGSCHEMA = '%s';", schemaName);
8085
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
8186
while (resultSet.next()) {
87+
StringBuilder sqlBuilder = new StringBuilder();
8288
String ddl = resultSet.getString("TEXT");
8389
sqlBuilder.append(ddl).append(";").append("\n");
90+
asyncContext.write(sqlBuilder.toString());
8491
}
8592
}
8693
}
@@ -104,4 +111,14 @@ public void dropTable(Connection connection, String databaseName, String schemaN
104111
String sql = "DROP TABLE " + tableName;
105112
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
106113
}
114+
115+
@Override
116+
public void copyTable(Connection connection, String databaseName, String schemaName, String tableName, String newTableName,boolean copyData) throws SQLException {
117+
String sql = "CREATE TABLE " + newTableName + " LIKE " + tableName + " INCLUDING INDEXES";
118+
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
119+
if(copyData){
120+
sql = "INSERT INTO " + newTableName + " SELECT * FROM " + tableName;
121+
SQLExecutor.getInstance().execute(connection, sql, resultSet -> null);
122+
}
123+
}
107124
}

chat2db-server/chat2db-plugins/chat2db-db2/src/main/java/ai/chat2db/plugin/db2/builder/DB2SqlBuilder.java

+12
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public String buildCreateTableSql(Table table) {
2222
continue;
2323
}
2424
DB2ColumnTypeEnum typeEnum = DB2ColumnTypeEnum.getByType(column.getColumnType());
25+
if (typeEnum == null) {
26+
continue;
27+
}
2528
script.append("\t").append(typeEnum.buildCreateColumnSql(column)).append(",\n");
2629
}
2730

@@ -33,6 +36,9 @@ public String buildCreateTableSql(Table table) {
3336
continue;
3437
}
3538
DB2IndexTypeEnum indexTypeEnum = DB2IndexTypeEnum.getByType(tableIndex.getType());
39+
if (indexTypeEnum == null) {
40+
continue;
41+
}
3642
script.append("\n").append("").append(indexTypeEnum.buildIndexScript(tableIndex)).append(";");
3743
if(StringUtils.isNotBlank(tableIndex.getComment())){
3844
script.append("\n").append(indexTypeEnum.buildIndexComment(tableIndex)).append(";");
@@ -84,6 +90,9 @@ public String buildModifyTaleSql(Table oldTable, Table newTable) {
8490
for (TableColumn tableColumn : newTable.getColumnList()) {
8591
if (StringUtils.isNotBlank(tableColumn.getEditStatus())) {
8692
DB2ColumnTypeEnum typeEnum = DB2ColumnTypeEnum.getByType(tableColumn.getColumnType());
93+
if (typeEnum == null) {
94+
continue;
95+
}
8796
script.append("\t").append(typeEnum.buildModifyColumn(tableColumn)).append(";\n");
8897
if (StringUtils.isNotBlank(tableColumn.getComment())) {
8998
script.append("\n").append(buildComment(tableColumn)).append(";\n");
@@ -95,6 +104,9 @@ public String buildModifyTaleSql(Table oldTable, Table newTable) {
95104
for (TableIndex tableIndex : newTable.getIndexList()) {
96105
if (StringUtils.isNotBlank(tableIndex.getEditStatus()) && StringUtils.isNotBlank(tableIndex.getType())) {
97106
DB2IndexTypeEnum mysqlIndexTypeEnum = DB2IndexTypeEnum.getByType(tableIndex.getType());
107+
if (mysqlIndexTypeEnum == null) {
108+
continue;
109+
}
98110
script.append("\t").append(mysqlIndexTypeEnum.buildModifyIndex(tableIndex)).append(";\n");
99111
if(StringUtils.isNotBlank(tableIndex.getComment())) {
100112
script.append("\n").append(mysqlIndexTypeEnum.buildIndexComment(tableIndex)).append(";\n");

0 commit comments

Comments
 (0)