From f266f5a869b3273986f80e32b6e65762180fc419 Mon Sep 17 00:00:00 2001 From: pancx Date: Sun, 23 Feb 2025 23:33:33 +0800 Subject: [PATCH] [#6493] feat(CLI): Support table format output for Schema and Table command fix some bugs. --- .../gravitino/cli/commands/ListSchema.java | 16 ++----- .../gravitino/cli/commands/ListTables.java | 20 ++------ .../gravitino/cli/outputs/TableFormat.java | 46 ++++++------------- .../integration/test/TableFormatOutputIT.java | 4 +- .../gravitino/cli/output/TestTableFormat.java | 22 +++------ 5 files changed, 28 insertions(+), 80 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java index e71363f516c..1651c1b1805 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java @@ -19,8 +19,6 @@ package org.apache.gravitino.cli.commands; -import org.apache.gravitino.Catalog; -import org.apache.gravitino.Schema; import org.apache.gravitino.cli.CommandContext; import org.apache.gravitino.cli.ErrorMessages; import org.apache.gravitino.client.GravitinoClient; @@ -50,12 +48,9 @@ public ListSchema(CommandContext context, String metalake, String catalog) { @Override public void handle() { String[] schemas = new String[0]; - Catalog tableCatalog = null; - try { GravitinoClient client = buildClient(metalake); - tableCatalog = client.loadCatalog(catalog); - schemas = tableCatalog.asSchemas().listSchemas(); + schemas = client.loadCatalog(catalog).asSchemas().listSchemas(); } catch (NoSuchMetalakeException err) { exitWithError(ErrorMessages.UNKNOWN_METALAKE); } catch (NoSuchCatalogException err) { @@ -65,15 +60,10 @@ public void handle() { } if (schemas.length == 0) { - printInformation("No schemas found in catalog " + catalog); + printInformation("No schemas exist."); return; } - // PERF load table may cause performance issue - Schema[] schemaObjects = new Schema[schemas.length]; - for (int i = 0; i < schemas.length; i++) { - schemaObjects[i] = tableCatalog.asSchemas().loadSchema(schemas[i]); - } - printResults(schemaObjects); + printResults(schemas); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java index 642dd45766a..5a25ec28279 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java @@ -24,8 +24,6 @@ import org.apache.gravitino.NameIdentifier; import org.apache.gravitino.Namespace; import org.apache.gravitino.cli.CommandContext; -import org.apache.gravitino.rel.Table; -import org.apache.gravitino.rel.TableCatalog; /** List the names of all tables in a schema. */ public class ListTables extends TableCommand { @@ -50,25 +48,15 @@ public ListTables(CommandContext context, String metalake, String catalog, Strin public void handle() { NameIdentifier[] tables = null; Namespace name = Namespace.of(schema); - TableCatalog tableCatalog = null; - try { - tableCatalog = tableCatalog(); - tables = tableCatalog.listTables(name); + tables = tableCatalog().listTables(name); } catch (Exception exp) { exitWithError(exp.getMessage()); } List tableNames = new ArrayList<>(); - for (NameIdentifier table : tables) { - tableNames.add(table.name()); - } - // PERF load table may cause performance issue - Table[] tableObjects = new Table[tableNames.size()]; - int i = 0; - for (NameIdentifier tableIdent : tables) { - tableObjects[i] = tableCatalog.loadTable(tableIdent); - i++; + for (int i = 0; i < tables.length; i++) { + tableNames.add(tables[i].name()); } if (tableNames.isEmpty()) { @@ -76,6 +64,6 @@ public void handle() { return; } - printResults(tableObjects); + printResults(tableNames); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java index c3a4fa3647d..f90f9193e7c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java @@ -79,12 +79,10 @@ public static void output(Object entity, CommandContext context) { new CatalogListTableFormat(context).output((Catalog[]) entity); } else if (entity instanceof Schema) { new SchemaTableFormat(context).output((Schema) entity); - } else if (entity instanceof Schema[]) { - new SchemaListTableFormat(context).output((Schema[]) entity); } else if (entity instanceof Table) { new TableDetailsTableFormat(context).output((Table) entity); - } else if (entity instanceof Table[]) { - new TableListTableFormat(context).output((Table[]) entity); + } else if (entity instanceof String[]) { + new ListTableFormat(context).output((String[]) entity); } else { throw new IllegalArgumentException("Unsupported object type"); } @@ -497,7 +495,7 @@ public MetalakeListTableFormat(CommandContext context) { @Override public String getOutput(Metalake[] metalakes) { - Column columnName = new Column(context, "metalake"); + Column columnName = new Column(context, "Name"); Arrays.stream(metalakes).forEach(metalake -> columnName.addCell(metalake.name())); return getTableFormat(columnName); @@ -544,7 +542,7 @@ public CatalogListTableFormat(CommandContext context) { /** {@inheritDoc} */ @Override public String getOutput(Catalog[] catalogs) { - Column columnName = new Column(context, "catalog"); + Column columnName = new Column(context, "Name"); Arrays.stream(catalogs).forEach(metalake -> columnName.addCell(metalake.name())); return getTableFormat(columnName); @@ -573,25 +571,6 @@ public String getOutput(Schema schema) { } } - /** - * Formats an array of Schemas into a single-column table display. Lists all schema names in a - * vertical format. - */ - static final class SchemaListTableFormat extends TableFormat { - public SchemaListTableFormat(CommandContext context) { - super(context); - } - - /** {@inheritDoc} */ - @Override - public String getOutput(Schema[] schemas) { - Column column = new Column(context, "schema"); - Arrays.stream(schemas).forEach(schema -> column.addCell(schema.name())); - - return getTableFormat(column); - } - } - /** * Formats a single {@link Table} instance into a two-column table display. Displays table details * including name and comment information. @@ -625,20 +604,21 @@ public String getOutput(Table table) { } } - /** - * Formats an array of {@link Table} into a single-column table display. Lists all table names in - * a vertical format. - */ - static final class TableListTableFormat extends TableFormat { - public TableListTableFormat(CommandContext context) { + static final class ListTableFormat extends TableFormat { + /** + * Creates a new {@link TableFormat} with the specified properties. + * + * @param context the command context. + */ + public ListTableFormat(CommandContext context) { super(context); } /** {@inheritDoc} */ @Override - public String getOutput(Table[] tables) { + public String getOutput(String[] entities) { Column column = new Column(context, "name"); - Arrays.stream(tables).forEach(table -> column.addCell(table.name())); + Arrays.stream(entities).forEach(column::addCell); return getTableFormat(column); } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java b/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java index bca9e960ff5..e8b8b2c17df 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java @@ -106,7 +106,7 @@ public void testMetalakeListCommand() { String output = new String(outputStream.toByteArray(), StandardCharsets.UTF_8).trim(); assertEquals( "+-------------+\n" - + "| Metalake |\n" + + "| Name |\n" + "+-------------+\n" + "| my_metalake |\n" + "+-------------+", @@ -170,7 +170,7 @@ public void testCatalogListCommand() { String output = new String(outputStream.toByteArray(), StandardCharsets.UTF_8).trim(); assertEquals( "+-----------+\n" - + "| Catalog |\n" + + "| Name |\n" + "+-----------+\n" + "| postgres |\n" + "| postgres2 |\n" diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java b/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java index 9c6df8e94e3..448ae31081a 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java @@ -255,7 +255,7 @@ void testListMetalakeWithTableFormat() { String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); Assertions.assertEquals( "+-----------+\n" - + "| Metalake |\n" + + "| Name |\n" + "+-----------+\n" + "| metalake1 |\n" + "| metalake2 |\n" @@ -282,16 +282,11 @@ void testCatalogDetailsWithTableFormat() { @Test void testListCatalogWithTableFormat() { CommandContext mockContext = getMockContext(); - Catalog mockCatalog1 = - getMockCatalog("catalog1", Catalog.Type.FILESET, "provider1", "This is a catalog"); - Catalog mockCatalog2 = - getMockCatalog("catalog2", Catalog.Type.RELATIONAL, "provider2", "This is another catalog"); - - TableFormat.output(new Catalog[] {mockCatalog1, mockCatalog2}, mockContext); + TableFormat.output(new String[] {"catalog1", "catalog2"}, mockContext); String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); Assertions.assertEquals( "+----------+\n" - + "| Catalog |\n" + + "| Name |\n" + "+----------+\n" + "| catalog1 |\n" + "| catalog2 |\n" @@ -318,14 +313,11 @@ void testSchemaDetailsWithTableFormat() { @Test void testListSchemaWithTableFormat() { CommandContext mockContext = getMockContext(); - Schema mockSchema1 = getMockSchema("schema1", "This is a schema"); - Schema mockSchema2 = getMockSchema("schema2", "This is another schema"); - - TableFormat.output(new Schema[] {mockSchema1, mockSchema2}, mockContext); + TableFormat.output(new String[] {"schema1", "schema2"}, mockContext); String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); Assertions.assertEquals( "+---------+\n" - + "| Schema |\n" + + "| Name |\n" + "+---------+\n" + "| schema1 |\n" + "| schema2 |\n" @@ -353,10 +345,8 @@ void testTableDetailsWithTableFormat() { @Test void testListTableWithTableFormat() { CommandContext mockContext = getMockContext(); - Table mockTable1 = getMockTable("table1", "This is a table"); - Table mockTable2 = getMockTable("table2", "This is another table"); - TableFormat.output(new Table[] {mockTable1, mockTable2}, mockContext); + TableFormat.output(new String[] {"table1", "table2"}, mockContext); String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); Assertions.assertEquals( "+--------+\n"