This commit is contained in:
SwallowGG
2023-09-24 09:59:15 +08:00
parent d7e811f4b4
commit e9d7df9310
2 changed files with 67 additions and 3 deletions

View File

@ -1,14 +1,16 @@
package ai.chat2db.plugin.mysql;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
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.plugin.mysql.type.MysqlIndexTypeEnum;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.jdbc.DefaultMetaService;
@ -137,6 +139,65 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData {
});
}
@Override
public List<TableIndex> indexes(Connection connection, String databaseName, String schemaName, String tableName) {
StringBuilder queryBuf = new StringBuilder("SHOW INDEX FROM ");
queryBuf.append("`").append(tableName).append("`");
queryBuf.append(" FROM ");
queryBuf.append("`").append(databaseName).append("`");
return SQLExecutor.getInstance().execute(connection, queryBuf.toString(), resultSet -> {
LinkedHashMap<String, TableIndex> map = new LinkedHashMap();
while (resultSet.next()) {
String keyName = resultSet.getString("Key_name");
TableIndex tableIndex = map.get(keyName);
if (tableIndex != null) {
List<TableIndexColumn> columnList = tableIndex.getColumnList();
columnList.add(getTableIndexColumn(resultSet));
columnList = columnList.stream().sorted(Comparator.comparing(TableIndexColumn::getOrdinalPosition))
.collect(Collectors.toList());
tableIndex.setColumnList(columnList);
} else {
TableIndex index = new TableIndex();
index.setDatabaseName(databaseName);
index.setSchemaName(schemaName);
index.setTableName(tableName);
index.setName(keyName);
index.setUnique(!resultSet.getBoolean("Non_unique"));
index.setType(resultSet.getString("Index_type"));
index.setComment(resultSet.getString("Index_comment"));
List<TableIndexColumn> tableIndexColumns = new ArrayList<>();
tableIndexColumns.add(getTableIndexColumn(resultSet));
index.setColumnList(tableIndexColumns);
if ("PRIMARY".equalsIgnoreCase(keyName)) {
index.setType(MysqlIndexTypeEnum.PRIMARY_KEY.getName());
} else if (index.getUnique()) {
index.setType(MysqlIndexTypeEnum.UNIQUE.getName());
} else if ("SPATIAL".equalsIgnoreCase(index.getType())) {
index.setType(MysqlIndexTypeEnum.SPATIAL.getName());
}else if("FULLTEXT".equalsIgnoreCase(index.getType())){
index.setType(MysqlIndexTypeEnum.FULLTEXT.getName());
}else {
index.setType(MysqlIndexTypeEnum.NORMAL.getName());
}
map.put(keyName, index);
}
}
return map.values().stream().collect(Collectors.toList());
});
}
private TableIndexColumn getTableIndexColumn(ResultSet resultSet) throws SQLException {
TableIndexColumn tableIndexColumn = new TableIndexColumn();
tableIndexColumn.setColumnName(resultSet.getString("Column_name"));
tableIndexColumn.setOrdinalPosition(resultSet.getShort("Seq_in_index"));
tableIndexColumn.setCollation(resultSet.getString("Collation"));
tableIndexColumn.setCardinality(resultSet.getLong("Cardinality"));
tableIndexColumn.setSubPart(resultSet.getLong("Sub_part"));
tableIndexColumn.setAscOrDesc(resultSet.getString("Collation"));
return tableIndexColumn;
}
@Override
public SqlBuilder getSqlBuilder() {
return new MysqlSqlBuilder();