|
1 | 1 | package ai.chat2db.plugin.dm; |
2 | 2 |
|
3 | 3 | import java.sql.Connection; |
| 4 | +import java.sql.ResultSet; |
4 | 5 | import java.sql.SQLException; |
5 | | -import java.util.ArrayList; |
6 | | -import java.util.Arrays; |
7 | | -import java.util.List; |
| 6 | +import java.util.*; |
| 7 | +import java.util.stream.Collectors; |
8 | 8 |
|
| 9 | +import ai.chat2db.plugin.dm.builder.DMSqlBuilder; |
| 10 | +import ai.chat2db.plugin.dm.type.DMColumnTypeEnum; |
| 11 | +import ai.chat2db.plugin.dm.type.DMIndexTypeEnum; |
9 | 12 | import ai.chat2db.spi.MetaData; |
| 13 | +import ai.chat2db.spi.SqlBuilder; |
10 | 14 | import ai.chat2db.spi.jdbc.DefaultMetaService; |
11 | 15 | import ai.chat2db.spi.model.*; |
12 | 16 | import ai.chat2db.spi.sql.SQLExecutor; |
13 | 17 | import ai.chat2db.spi.util.SortUtils; |
14 | 18 | import ai.chat2db.spi.util.SqlUtils; |
| 19 | +import com.google.common.collect.Lists; |
15 | 20 | import jakarta.validation.constraints.NotEmpty; |
| 21 | +import org.apache.commons.lang3.StringUtils; |
16 | 22 |
|
17 | 23 | public class DMMetaData extends DefaultMetaService implements MetaData { |
18 | 24 |
|
@@ -138,4 +144,85 @@ public Table view(Connection connection, String databaseName, String schemaName, |
138 | 144 | return table; |
139 | 145 | }); |
140 | 146 | } |
| 147 | + |
| 148 | + private static String INDEX_SQL = "SELECT i.TABLE_NAME, i.INDEX_TYPE, i.INDEX_NAME, i.UNIQUENESS ,c.COLUMN_NAME, c.COLUMN_POSITION, c.DESCEND, cons.CONSTRAINT_TYPE FROM ALL_INDEXES i JOIN ALL_IND_COLUMNS c ON i.INDEX_NAME = c.INDEX_NAME AND i.TABLE_NAME = c.TABLE_NAME AND i.TABLE_OWNER = c.TABLE_OWNER LEFT JOIN ALL_CONSTRAINTS cons ON i.INDEX_NAME = cons.INDEX_NAME AND i.TABLE_NAME = cons.TABLE_NAME AND i.TABLE_OWNER = cons.OWNER WHERE i.TABLE_NAME = '%s' ORDER BY i.INDEX_NAME, c.COLUMN_POSITION;"; |
| 149 | + |
| 150 | + @Override |
| 151 | + public List<TableIndex> indexes(Connection connection, String databaseName, String schemaName, String tableName) { |
| 152 | + String sql = String.format(INDEX_SQL, schemaName, tableName); |
| 153 | + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { |
| 154 | + LinkedHashMap<String, TableIndex> map = new LinkedHashMap(); |
| 155 | + while (resultSet.next()) { |
| 156 | + String keyName = resultSet.getString("INDEX_NAME"); |
| 157 | + TableIndex tableIndex = map.get(keyName); |
| 158 | + if (tableIndex != null) { |
| 159 | + List<TableIndexColumn> columnList = tableIndex.getColumnList(); |
| 160 | + columnList.add(getTableIndexColumn(resultSet)); |
| 161 | + columnList = columnList.stream().sorted(Comparator.comparing(TableIndexColumn::getOrdinalPosition)) |
| 162 | + .collect(Collectors.toList()); |
| 163 | + tableIndex.setColumnList(columnList); |
| 164 | + } else { |
| 165 | + TableIndex index = new TableIndex(); |
| 166 | + index.setDatabaseName(databaseName); |
| 167 | + index.setSchemaName(schemaName); |
| 168 | + index.setTableName(tableName); |
| 169 | + index.setName(keyName); |
| 170 | + index.setUnique("UNIQUE".equalsIgnoreCase(resultSet.getString("UNIQUENESS"))); |
| 171 | +// index.setType(resultSet.getString("Index_type")); |
| 172 | +// index.setComment(resultSet.getString("Index_comment")); |
| 173 | + List<TableIndexColumn> tableIndexColumns = new ArrayList<>(); |
| 174 | + tableIndexColumns.add(getTableIndexColumn(resultSet)); |
| 175 | + index.setColumnList(tableIndexColumns); |
| 176 | + if ("P".equalsIgnoreCase(resultSet.getString("CONSTRAINT_TYPE"))) { |
| 177 | + index.setType(DMIndexTypeEnum.PRIMARY_KEY.getName()); |
| 178 | + } else if (index.getUnique()) { |
| 179 | + index.setType(DMIndexTypeEnum.UNIQUE.getName()); |
| 180 | + } else if ("BITMAP".equalsIgnoreCase(resultSet.getString("INDEX_TYPE"))) { |
| 181 | + index.setType(DMIndexTypeEnum.BITMAP.getName()); |
| 182 | + } else { |
| 183 | + index.setType(DMIndexTypeEnum.NORMAL.getName()); |
| 184 | + } |
| 185 | + map.put(keyName, index); |
| 186 | + } |
| 187 | + } |
| 188 | + return map.values().stream().collect(Collectors.toList()); |
| 189 | + }); |
| 190 | + |
| 191 | + } |
| 192 | + |
| 193 | + private TableIndexColumn getTableIndexColumn(ResultSet resultSet) throws SQLException { |
| 194 | + TableIndexColumn tableIndexColumn = new TableIndexColumn(); |
| 195 | + tableIndexColumn.setColumnName(resultSet.getString("COLUMN_NAME")); |
| 196 | + tableIndexColumn.setOrdinalPosition(resultSet.getShort("COLUMN_POSITION")); |
| 197 | +// tableIndexColumn.setCollation(resultSet.getString("Collation")); |
| 198 | +// tableIndexColumn.setCardinality(resultSet.getLong("Cardinality")); |
| 199 | +// tableIndexColumn.setSubPart(resultSet.getLong("Sub_part")); |
| 200 | + String collation = resultSet.getString("DESCEND"); |
| 201 | + if ("ASC".equalsIgnoreCase(collation)) { |
| 202 | + tableIndexColumn.setAscOrDesc("ASC"); |
| 203 | + } else if ("DESC".equalsIgnoreCase(collation)) { |
| 204 | + tableIndexColumn.setAscOrDesc("DESC"); |
| 205 | + } |
| 206 | + return tableIndexColumn; |
| 207 | + } |
| 208 | + |
| 209 | + @Override |
| 210 | + public SqlBuilder getSqlBuilder() { |
| 211 | + return new DMSqlBuilder(); |
| 212 | + } |
| 213 | + |
| 214 | + @Override |
| 215 | + public TableMeta getTableMeta(String databaseName, String schemaName, String tableName) { |
| 216 | + return TableMeta.builder() |
| 217 | + .columnTypes(DMColumnTypeEnum.getTypes()) |
| 218 | + .charsets(Lists.newArrayList()) |
| 219 | + .collations(Lists.newArrayList()) |
| 220 | + .indexTypes(DMIndexTypeEnum.getIndexTypes()) |
| 221 | + .build(); |
| 222 | + } |
| 223 | + |
| 224 | + @Override |
| 225 | + public String getMetaDataName(String... names) { |
| 226 | + return Arrays.stream(names).filter(name -> StringUtils.isNotBlank(name)).map(name -> "\"" + name + "\"").collect(Collectors.joining(".")); |
| 227 | + } |
141 | 228 | } |
0 commit comments