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

Reply via email to