Skip to content

Commit

Permalink
merge
Browse files Browse the repository at this point in the history
  • Loading branch information
shanhexi committed Sep 22, 2023
2 parents 11927df + d7e811f commit 74606a8
Show file tree
Hide file tree
Showing 17 changed files with 275 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,26 @@

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import ai.chat2db.plugin.mysql.builder.MysqlSqlBuilder;
import ai.chat2db.plugin.mysql.type.MysqlCharsetEnum;
import ai.chat2db.plugin.mysql.type.MysqlCollationEnum;
import ai.chat2db.plugin.mysql.type.MysqlColumnTypeEnum;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultMetaService;
import ai.chat2db.spi.model.Function;
import ai.chat2db.spi.model.Procedure;
import ai.chat2db.spi.model.Table;
import ai.chat2db.spi.model.Trigger;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.SQLExecutor;
import jakarta.validation.constraints.NotEmpty;

public class MysqlMetaData extends DefaultMetaService implements MetaData {
@Override
public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName,
@NotEmpty String tableName) {
@NotEmpty String tableName) {
String sql = "SHOW CREATE TABLE " + format(databaseName) + "."
+ format(tableName);
+ format(tableName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
if (resultSet.next()) {
return resultSet.getString("Create Table");
Expand All @@ -34,14 +35,14 @@ public static String format(String tableName) {
}

private static String ROUTINES_SQL
=
"SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE "
+ "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
+ "routine_name = '%s';";
=
"SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE "
+ "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND "
+ "routine_name = '%s';";

@Override
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,
String functionName) {
String functionName) {

String sql = String.format(ROUTINES_SQL, "FUNCTION", databaseName, functionName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Expand All @@ -60,11 +61,11 @@ public Function function(Connection connection, @NotEmpty String databaseName, S
}

private static String TRIGGER_SQL
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where "
+ "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";
= "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where "
+ "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';";

private static String TRIGGER_SQL_LIST
= "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';";
= "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';";

@Override
public List<Trigger> triggers(Connection connection, String databaseName, String schemaName) {
Expand All @@ -84,7 +85,7 @@ public List<Trigger> triggers(Connection connection, String databaseName, String

@Override
public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName,
String triggerName) {
String triggerName) {

String sql = String.format(TRIGGER_SQL, databaseName, triggerName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Expand All @@ -101,7 +102,7 @@ public Trigger trigger(Connection connection, @NotEmpty String databaseName, Str

@Override
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
String procedureName) {
String procedureName) {
String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName);
return SQLExecutor.getInstance().execute(connection, sql, resultSet -> {
Procedure procedure = new Procedure();
Expand All @@ -118,8 +119,8 @@ public Procedure procedure(Connection connection, @NotEmpty String databaseName,
}

private static String VIEW_SQL
= "SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME AS ViewName, VIEW_DEFINITION AS definition, CHECK_OPTION, "
+ "IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';";
= "SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME AS ViewName, VIEW_DEFINITION AS definition, CHECK_OPTION, "
+ "IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';";

@Override
public Table view(Connection connection, String databaseName, String schemaName, String viewName) {
Expand All @@ -135,8 +136,18 @@ public Table view(Connection connection, String databaseName, String schemaName,
return table;
});
}

@Override
public SqlBuilder getSqlBuilder() {
return new MysqlSqlBuilder();
}

@Override
public TableMeta getTableMeta(String databaseName, String schemaName, String tableName) {
return TableMeta.builder()
.columnTypes(MysqlColumnTypeEnum.getTypes())
.charsets(MysqlCharsetEnum.getCharsets())
.collations(MysqlCollationEnum.getCollations())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public String buildCreateTableSql(Table table) {
// append primary key and index
for (TableIndex tableIndex : table.getIndexList()) {
MysqlIndexTypeEnum mysqlIndexTypeEnum = MysqlIndexTypeEnum.getByType(tableIndex.getType());
script.append("\t").append(mysqlIndexTypeEnum.buildIndexScript(tableIndex)).append(",\n");
script.append("\t").append("ADD ").append(mysqlIndexTypeEnum.buildIndexScript(tableIndex)).append(",\n");
}

script = new StringBuilder(script.substring(0, script.length() - 2));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package ai.chat2db.plugin.mysql.type;

import ai.chat2db.spi.model.Charset;
import org.checkerframework.checker.units.qual.C;

import java.util.Arrays;
import java.util.List;

public enum MysqlCharsetEnum {

UTF8("utf8", "utf8_general_ci"),
BIG5("big5", "big5_chinese_ci"),
DEC8("dec8", "dec8_swedish_ci"),
CP850("cp850", "cp850_general_ci"),
HP8("hp8", "hp8_english_ci"),
KOI8R("koi8r", "koi8r_general_ci"),
LATIN1("latin1", "latin1_swedish_ci"),
LATIN2("latin2", "latin2_general_ci"),
SWE7("swe7", "swe7_swedish_ci"),
ASCII("ascii", "ascii_general_ci"),
UJIS("ujis", "ujis_japanese_ci"),
SJIS("sjis", "sjis_japanese_ci"),
HEBREW("hebrew", "hebrew_general_ci"),
TIS620("tis620", "tis620_thai_ci"),
EUCKR("euckr", "euckr_korean_ci"),
KOI8U("koi8u", "koi8u_general_ci"),
GB2312("gb2312", "gb2312_chinese_ci"),
GREEK("greek", "greek_general_ci"),
CP1250("cp1250", "cp1250_general_ci"),
GBK("gbk", "gbk_chinese_ci"),
LATIN5("latin5", "latin5_turkish_ci"),
ARMSCII8("armscii8", "armscii8_general_ci"),
UCS2("ucs2", "ucs2_general_ci"),
CP866("cp866", "cp866_general_ci"),
KEYBCS2("keybcs2", "keybcs2_general_ci"),
MACCE("macce", "macce_general_ci"),
MACROMAN("macroman", "macroman_general_ci"),
CP852("cp852", "cp852_general_ci"),
LATIN7("latin7", "latin7_general_ci"),
UTF8MB4("utf8mb4", "utf8mb4_general_ci"),
CP1251("cp1251", "cp1251_general_ci"),
UTF16("utf16", "utf16_general_ci"),
UTF16LE("utf16le", "utf16le_general_ci"),
CP1256("cp1256", "cp1256_general_ci"),
CP1257("cp1257", "cp1257_general_ci"),
UTF32("utf32", "utf32_general_ci"),
BINARY("binary", "binary"),
GEOSTD8("geostd8", "geostd8_general_ci"),
CP932("cp932", "cp932_japanese_ci"),
EUCJPMS("eucjpms", "eucjpms_japanese_ci"),
GB18030("gb18030", "gb18030_chinese_ci");
private Charset charset;

MysqlCharsetEnum(String charsetName, String defaultCollationName) {
this.charset = new Charset(charsetName, defaultCollationName);
}


public Charset getCharset() {
return charset;
}

public static List<Charset> getCharsets() {
return Arrays.stream(MysqlCharsetEnum.values()).map(MysqlCharsetEnum::getCharset).collect(java.util.stream.Collectors.toList());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package ai.chat2db.plugin.mysql.type;

import ai.chat2db.spi.model.Collation;

import java.util.Arrays;
import java.util.List;

public enum MysqlCollationEnum {

UTF8_GENERAL_CI("utf8_general_ci"),

UTF8MB4_GENERAL_CI("utf8mb4_general_ci"),

BIG5_CHINESE_CI("big5_chinese_ci"),
DEC8_SWEDISH_CI("dec8_swedish_ci"),

HP8_ENGLISH_CI("hp8_english_ci"),
KOI8R_GENERAL_CI("koi8r_general_ci"),
LATIN1_SWEDISH_CI("latin1_swedish_ci"),
LATIN2_GENERAL_CI("latin2_general_ci"),
SWE7_SWEDISH_CI("swe7_swedish_ci"),
ASCII_GENERAL_CI("ascii_general_ci"),
UJIS_JAPANESE_CI("ujis_japanese_ci"),
SJIS_JAPANESE_CI("sjis_japanese_ci"),
HEBREW_GENERAL_CI("hebrew_general_ci"),
TIS620_THAI_CI("tis620_thai_ci"),
EUCKR_KOREAN_CI("euckr_korean_ci"),
KOI8U_GENERAL_CI("koi8u_general_ci"),
GB2312_CHINESE_CI("gb2312_chinese_ci"),
GREEK_GENERAL_CI("greek_general_ci"),
CP1250_GENERAL_CI("cp1250_general_ci"),
GBK_CHINESE_CI("gbk_chinese_ci"),
LATIN5_TURKISH_CI("latin5_turkish_ci"),
ARMSCII8_GENERAL_CI("armscii8_general_ci"),
CP1250_CZECH_CS("cp1250_czech_cs"),
UCS2_GENERAL_CI("ucs2_general_ci"),
CP866_GENERAL_CI("cp866_general_ci"),
KEYBCS2_GENERAL_CI("keybcs2_general_ci"),
MACCE_GENERAL_CI("macce_general_ci"),
MACROMAN_GENERAL_CI("macroman_general_ci"),
CP852_GENERAL_CI("cp852_general_ci"),
LATIN7_GENERAL_CI("latin7_general_ci"),
CP1251_GENERAL_CI("cp1251_general_ci"),
UTF16_GENERAL_CI("utf16_general_ci"),
UTF16LE_GENERAL_CI("utf16le_general_ci"),
CP1256_GENERAL_CI("cp1256_general_ci"),
CP1257_GENERAL_CI("cp1257_general_ci"),
UTF32_GENERAL_CI("utf32_general_ci"),
BINARY("binary"),
GEOSTD8_GENERAL_CI("geostd8_general_ci"),
CP932_JAPANESE_CI("cp932_japanese_ci"),
EUCJPMS_JAPANESE_CI("eucjpms_japanese_ci"),
GB18030_CHINESE_CI("gb18030_chinese_ci"),
;
private Collation collation;

MysqlCollationEnum(String collationName) {
this.collation = new Collation(collationName);
}

public Collation getCollation() {
return collation;
}

public static List<Collation> getCollations() {
return Arrays.asList(MysqlCollationEnum.values()).stream().map(MysqlCollationEnum::getCollation).collect(java.util.stream.Collectors.toList());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public enum MysqlColumnTypeEnum implements ColumnBuilder {
Expand Down Expand Up @@ -131,7 +132,7 @@ public ColumnType getColumnType() {

static {
for (MysqlColumnTypeEnum value : MysqlColumnTypeEnum.values()) {
COLUMN_TYPE_MAP.put(value.getColumnType().getDataTypeName(), value);
COLUMN_TYPE_MAP.put(value.getColumnType().getTypeName(), value);
}
}

Expand Down Expand Up @@ -238,7 +239,7 @@ private String buildNullable(TableColumn column,MysqlColumnTypeEnum type) {
}

private String buildDataType(TableColumn column, MysqlColumnTypeEnum type) {
String columnType = type.columnType.getDataTypeName();
String columnType = type.columnType.getTypeName();
if (Arrays.asList(BINARY, VARBINARY, VARCHAR, CHAR).contains(type)) {
return StringUtils.join(columnType, "(", column.getColumnSize(), ")");
}
Expand Down Expand Up @@ -298,5 +299,11 @@ private String unsignedDataType(String dataTypeName, String middle) {
return StringUtils.join(dataTypeName, middle);
}

public static List<ColumnType> getTypes(){
return Arrays.stream(MysqlColumnTypeEnum.values()).map(columnTypeEnum ->
columnTypeEnum.getColumnType()
).toList();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,11 @@ public String buildModifyIndex(TableIndex tableIndex) {
if (EditStatus.DELETE.name().equals(tableIndex.getEditStatus())) {
return buildDropIndex(tableIndex);
}
if (EditStatus.ADD.name().equals(tableIndex.getEditStatus())) {
if (EditStatus.MODIFY.name().equals(tableIndex.getEditStatus())) {
return StringUtils.join(buildDropIndex(tableIndex),",\n", "ADD ", buildIndexScript(tableIndex));
}
if (EditStatus.MODIFY.name().equals(tableIndex.getEditStatus())) {
return StringUtils.join("MODIFY ", buildIndexScript(tableIndex));
if (EditStatus.ADD.name().equals(tableIndex.getEditStatus())) {
return StringUtils.join("ADD ", buildIndexScript(tableIndex));
}
return "";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,11 @@ public interface TableService {
* @return
*/
List<Type> queryTypes(TypeQueryParam param);

/**
*
* @param param
* @return
*/
TableMeta queryTableMeta(TypeQueryParam param);
}
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,10 @@ public List<Type> queryTypes(TypeQueryParam param) {
MetaData metaSchema = Chat2DBContext.getMetaData();
return metaSchema.types(Chat2DBContext.getConnection());
}

@Override
public TableMeta queryTableMeta(TypeQueryParam param) {
MetaData metaSchema = Chat2DBContext.getMetaData();
return metaSchema.getTableMeta(null, null, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ public void export(@Valid @RequestBody DataExportRequest request, HttpServletRes
TableQueryParam param = rdbWebConverter.tableRequest2param(request);
for (TableVO tableVO: tableVOS) {
param.setTableName(tableVO.getName());
tableVO.setColumnList(rdbWebConverter.columnDto2vo(tableService.queryColumns(param)));
tableVO.setIndexList(rdbWebConverter.indexDto2vo(tableService.queryIndexes(param)));
tableVO.setColumnList(tableService.queryColumns(param));
tableVO.setIndexList(tableService.queryIndexes(param));
}
Class<?> targetClass = ExportServiceFactory.get(exportType.getCode());
Constructor<?> constructor = targetClass.getDeclaredConstructor();
Expand Down
Loading

0 comments on commit 74606a8

Please sign in to comment.