Skip to content

Commit

Permalink
Enhance the output information of SHOW TABLE METADATA (#29228)
Browse files Browse the repository at this point in the history
  • Loading branch information
RaigorJiang authored Nov 28, 2023
1 parent 7bfc3d4 commit da95e15
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase
Optional<SingleRule> singleRule = database.getRuleMetaData().findSingleRule(SingleRule.class);
if (singleRule.isPresent()) {
for (String each : singleRule.get().getLogicTableMapper().getTableNames()) {
actualDataNodes.remove(each);
actualDataNodes.remove(each.toLowerCase());
}
}
actualDataNodes.forEach((key, value) -> result.add(new LocalDataQueryResultRow(key, value.iterator().next().getDataSourceName())));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.util.json.JsonUtils;

import java.util.Arrays;
import java.util.Collection;
Expand All @@ -37,29 +40,31 @@ public final class ShowTableMetaDataExecutor implements DatabaseRequiredQueryabl

@Override
public Collection<String> getColumnNames() {
return Arrays.asList("database_name", "table_name", "type", "name");
return Arrays.asList("database_name", "table_name", "type", "name", "value");
}

@Override
public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowTableMetaDataStatement sqlStatement) {
String defaultSchema = new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName());
ShardingSphereSchema schema = database.getSchema(defaultSchema);
return schema.getAllTableNames().stream().filter(each -> sqlStatement.getTableNames().contains(each))
.map(each -> buildTableRows(database.getName(), schema, each)).flatMap(Collection::stream).collect(Collectors.toList());
return sqlStatement.getTableNames().stream().filter(each -> schema.getAllTableNames().contains(each.toLowerCase()))
.map(each -> buildTableRows(database.getName(), schema, each.toLowerCase())).flatMap(Collection::stream).collect(Collectors.toList());
}

private Collection<LocalDataQueryResultRow> buildTableRows(final String databaseName, final ShardingSphereSchema schema, final String tableName) {
Collection<LocalDataQueryResultRow> result = new LinkedList<>();
Collection<LocalDataQueryResultRow> columnRows = schema.getAllColumnNames(tableName).stream().map(each -> buildRow(databaseName, tableName, "COLUMN", each)).collect(Collectors.toList());
Collection<LocalDataQueryResultRow> indexRows = schema.getTable(tableName).getIndexValues().stream().map(ShardingSphereIndex::getName)
.map(each -> buildRow(databaseName, tableName, "INDEX", each)).collect(Collectors.toList());
result.addAll(columnRows);
result.addAll(indexRows);
ShardingSphereTable table = schema.getTable(tableName);
result.addAll(table.getColumnValues().stream().map(each -> buildColumnRow(databaseName, tableName, each)).collect(Collectors.toList()));
result.addAll(table.getIndexValues().stream().map(each -> buildIndexRow(databaseName, tableName, each)).collect(Collectors.toList()));
return result;
}

private LocalDataQueryResultRow buildRow(final String databaseName, final String tableName, final String type, final String name) {
return new LocalDataQueryResultRow(databaseName, tableName, type, name);
private LocalDataQueryResultRow buildColumnRow(final String databaseName, final String tableName, final ShardingSphereColumn column) {
return new LocalDataQueryResultRow(databaseName, tableName, "COLUMN", column.getName(), JsonUtils.toJsonString(column));
}

private LocalDataQueryResultRow buildIndexRow(final String databaseName, final String tableName, final ShardingSphereIndex index) {
return new LocalDataQueryResultRow(databaseName, tableName, "INDEX", index.getName(), JsonUtils.toJsonString(index));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,13 @@ class ShowTableMetaDataExecutorTest {
void assertGetColumnNames() {
ShowTableMetaDataExecutor executor = new ShowTableMetaDataExecutor();
Collection<String> columns = executor.getColumnNames();
assertThat(columns.size(), is(4));
assertThat(columns.size(), is(5));
Iterator<String> iterator = columns.iterator();
assertThat(iterator.next(), is("database_name"));
assertThat(iterator.next(), is("table_name"));
assertThat(iterator.next(), is("type"));
assertThat(iterator.next(), is("name"));
assertThat(iterator.next(), is("value"));
}

@Test
Expand All @@ -73,11 +74,14 @@ void assertExecute() {
assertThat(row.getCell(2), is("t_order"));
assertThat(row.getCell(3), is("COLUMN"));
assertThat(row.getCell(4), is("order_id"));
assertThat(row.getCell(5),
is("{\"name\":\"order_id\",\"dataType\":0,\"primaryKey\":false,\"generated\":false,\"caseSensitive\":false,\"visible\":true,\"unsigned\":false,\"nullable\":false}"));
row = iterator.next();
assertThat(row.getCell(1), is("foo_db"));
assertThat(row.getCell(2), is("t_order"));
assertThat(row.getCell(3), is("INDEX"));
assertThat(row.getCell(4), is("primary"));
assertThat(row.getCell(5), is("{\"name\":\"primary\",\"columns\":[],\"unique\":false}"));
}

private ShardingSphereDatabase mockDatabase() {
Expand Down

0 comments on commit da95e15

Please sign in to comment.