This is an automated email from the ASF dual-hosted git repository.
liuxun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 80218128b [#5745] feat(CLI): Table format output for ListCatalogs
command (#5759)
80218128b is described below
commit 80218128b366f85ff8668164f8e6085cb9f1f33d
Author: Jimmy Lee <[email protected]>
AuthorDate: Mon Dec 16 19:26:17 2024 +0800
[#5745] feat(CLI): Table format output for ListCatalogs command (#5759)
### What changes were proposed in this pull request?
Support table format output for ListCatalogs command.
### Why are the changes needed?
Issue: https://github.com/apache/gravitino/issues/5745
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
```
gcli catalog list -m <metalake_name>
gcli catalog list -m <metalake_name> --output plain
gcli catalog list -m <metalake_name> --output table
```
---
.../apache/gravitino/cli/GravitinoCommandLine.java | 2 +-
.../apache/gravitino/cli/TestableCommandLine.java | 5 +--
.../gravitino/cli/commands/ListCatalogs.java | 18 ++++------
.../apache/gravitino/cli/outputs/PlainFormat.java | 24 ++++++++++----
.../apache/gravitino/cli/outputs/TableFormat.java | 15 +++++++++
.../apache/gravitino/cli/TestCatalogCommands.java | 2 +-
.../cli/integration/test/TableFormatOutputIT.java | 38 ++++++++++++++++++++--
7 files changed, 81 insertions(+), 23 deletions(-)
diff --git
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
index 1e376b8be..0df9eab82 100644
---
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
+++
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
@@ -220,7 +220,7 @@ public class GravitinoCommandLine extends
TestableCommandLine {
Command.setAuthenticationMode(auth, userName);
if (CommandActions.LIST.equals(command)) {
- newListCatalogs(url, ignore, metalake).handle();
+ newListCatalogs(url, ignore, outputFormat, metalake).handle();
return;
}
diff --git
a/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
b/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
index 71457a126..c4e1f5fe5 100644
---
a/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
+++
b/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java
@@ -197,8 +197,9 @@ public class TestableCommandLine {
return new CatalogDetails(url, ignore, outputFormat, metalake, catalog);
}
- protected ListCatalogs newListCatalogs(String url, boolean ignore, String
metalake) {
- return new ListCatalogs(url, ignore, metalake);
+ protected ListCatalogs newListCatalogs(
+ String url, boolean ignore, String outputFormat, String metalake) {
+ return new ListCatalogs(url, ignore, outputFormat, metalake);
}
protected CreateCatalog newCreateCatalog(
diff --git
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java
index 6925b8328..eaff355e8 100644
---
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java
+++
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java
@@ -19,7 +19,7 @@
package org.apache.gravitino.cli.commands;
-import com.google.common.base.Joiner;
+import org.apache.gravitino.Catalog;
import org.apache.gravitino.cli.ErrorMessages;
import org.apache.gravitino.client.GravitinoClient;
import org.apache.gravitino.exceptions.NoSuchMetalakeException;
@@ -34,30 +34,26 @@ public class ListCatalogs extends Command {
*
* @param url The URL of the Gravitino server.
* @param ignoreVersions If true don't check the client/server versions
match.
+ * @param outputFormat The output format.
* @param metalake The name of the metalake.
*/
- public ListCatalogs(String url, boolean ignoreVersions, String metalake) {
- super(url, ignoreVersions);
+ public ListCatalogs(String url, boolean ignoreVersions, String outputFormat,
String metalake) {
+ super(url, ignoreVersions, outputFormat);
this.metalake = metalake;
}
/** Lists all catalogs in a metalake. */
@Override
public void handle() {
- String[] catalogs = new String[0];
+ Catalog[] catalogs;
try {
GravitinoClient client = buildClient(metalake);
- catalogs = client.listCatalogs();
+ catalogs = client.listCatalogsInfo();
+ output(catalogs);
} catch (NoSuchMetalakeException err) {
System.err.println(ErrorMessages.UNKNOWN_METALAKE);
- return;
} catch (Exception exp) {
System.err.println(exp.getMessage());
- return;
}
-
- String all = Joiner.on(",").join(catalogs);
-
- System.out.println(all.toString());
}
}
diff --git
a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java
b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java
index 4674d3f88..6160634db 100644
---
a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java
+++
b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java
@@ -28,24 +28,26 @@ import org.apache.gravitino.Metalake;
public class PlainFormat {
public static void output(Object object) {
if (object instanceof Metalake) {
- new MetalakeStringFormat().output((Metalake) object);
+ new MetalakePlainFormat().output((Metalake) object);
} else if (object instanceof Metalake[]) {
- new MetalakesStringFormat().output((Metalake[]) object);
+ new MetalakesPlainFormat().output((Metalake[]) object);
} else if (object instanceof Catalog) {
- new CatalogStringFormat().output((Catalog) object);
+ new CatalogPlainFormat().output((Catalog) object);
+ } else if (object instanceof Catalog[]) {
+ new CatalogsPlainFormat().output((Catalog[]) object);
} else {
throw new IllegalArgumentException("Unsupported object type");
}
}
- static final class MetalakeStringFormat implements OutputFormat<Metalake> {
+ static final class MetalakePlainFormat implements OutputFormat<Metalake> {
@Override
public void output(Metalake metalake) {
System.out.println(metalake.name() + "," + metalake.comment());
}
}
- static final class MetalakesStringFormat implements OutputFormat<Metalake[]>
{
+ static final class MetalakesPlainFormat implements OutputFormat<Metalake[]> {
@Override
public void output(Metalake[] metalakes) {
List<String> metalakeNames =
@@ -55,7 +57,7 @@ public class PlainFormat {
}
}
- static final class CatalogStringFormat implements OutputFormat<Catalog> {
+ static final class CatalogPlainFormat implements OutputFormat<Catalog> {
@Override
public void output(Catalog catalog) {
System.out.println(
@@ -68,4 +70,14 @@ public class PlainFormat {
+ catalog.comment());
}
}
+
+ static final class CatalogsPlainFormat implements OutputFormat<Catalog[]> {
+ @Override
+ public void output(Catalog[] catalogs) {
+ List<String> catalogNames =
+
Arrays.stream(catalogs).map(Catalog::name).collect(Collectors.toList());
+ String all = String.join(System.lineSeparator(), catalogNames);
+ System.out.println(all);
+ }
+ }
}
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 8744467b9..6946ad130 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
@@ -35,6 +35,8 @@ public class TableFormat {
new MetalakesTableFormat().output((Metalake[]) object);
} else if (object instanceof Catalog) {
new CatalogTableFormat().output((Catalog) object);
+ } else if (object instanceof Catalog[]) {
+ new CatalogsTableFormat().output((Catalog[]) object);
} else {
throw new IllegalArgumentException("Unsupported object type");
}
@@ -80,6 +82,19 @@ public class TableFormat {
}
}
+ static final class CatalogsTableFormat implements OutputFormat<Catalog[]> {
+ @Override
+ public void output(Catalog[] catalogs) {
+ List<String> headers = Collections.singletonList("catalog");
+ List<List<String>> rows = new ArrayList<>();
+ for (int i = 0; i < catalogs.length; i++) {
+ rows.add(Arrays.asList(catalogs[i].name()));
+ }
+ TableFormatImpl tableFormat = new TableFormatImpl();
+ tableFormat.print(headers, rows);
+ }
+ }
+
static final class TableFormatImpl {
private int[] maxElementLengths;
// This expression is primarily used to match characters that have a
display width of
diff --git
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
index 10c25f8f8..eb8bc46d3 100644
---
a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
+++
b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java
@@ -62,7 +62,7 @@ class TestCatalogCommands {
mockCommandLine, mockOptions, CommandEntities.CATALOG,
CommandActions.LIST));
doReturn(mockList)
.when(commandLine)
- .newListCatalogs(GravitinoCommandLine.DEFAULT_URL, false,
"metalake_demo");
+ .newListCatalogs(GravitinoCommandLine.DEFAULT_URL, false, null,
"metalake_demo");
commandLine.handleCommandLine();
verify(mockList).handle();
}
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 89034d642..f23d0284f 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
@@ -25,6 +25,7 @@ import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import org.apache.gravitino.cli.GravitinoOptions;
import org.apache.gravitino.cli.Main;
+import org.apache.gravitino.cli.commands.Command;
import org.apache.gravitino.integration.test.util.BaseIT;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -93,7 +94,7 @@ public class TableFormatOutputIT extends BaseIT {
"metalake",
"list",
commandArg(GravitinoOptions.OUTPUT),
- "table",
+ Command.OUTPUT_FORMAT_TABLE,
commandArg(GravitinoOptions.URL),
gravitinoUrl
};
@@ -125,7 +126,7 @@ public class TableFormatOutputIT extends BaseIT {
commandArg(GravitinoOptions.METALAKE),
"my_metalake",
commandArg(GravitinoOptions.OUTPUT),
- "table",
+ Command.OUTPUT_FORMAT_TABLE,
commandArg(GravitinoOptions.URL),
gravitinoUrl
};
@@ -144,6 +145,39 @@ public class TableFormatOutputIT extends BaseIT {
output);
}
+ @Test
+ public void testCatalogListCommand() {
+ // Create a byte array output stream to capture the output of the command
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ PrintStream originalOut = System.out;
+ System.setOut(new PrintStream(outputStream));
+
+ String[] args = {
+ "catalog",
+ "list",
+ commandArg(GravitinoOptions.METALAKE),
+ "my_metalake",
+ commandArg(GravitinoOptions.OUTPUT),
+ Command.OUTPUT_FORMAT_TABLE,
+ commandArg(GravitinoOptions.URL),
+ gravitinoUrl
+ };
+ Main.main(args);
+
+ // Restore the original System.out
+ System.setOut(originalOut);
+ // Get the output and verify it
+ String output = new String(outputStream.toByteArray(),
StandardCharsets.UTF_8).trim();
+ assertEquals(
+ "+-----------+\n"
+ + "| catalog |\n"
+ + "+-----------+\n"
+ + "| postgres |\n"
+ + "| postgres2 |\n"
+ + "+-----------+",
+ output);
+ }
+
@Test
public void testCatalogDetailsCommand() {
// Create a byte array output stream to capture the output of the command