diff --git a/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java b/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java index e135ef17a2cd..bfa0b5cb5099 100644 --- a/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java +++ b/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java @@ -420,6 +420,28 @@ public PagedList listTableDetailsPaged( return new PagedList<>(tables, response.getNextPageToken()); } + /** + * List table details for a database. + * + *

Gets an array of table details for a database. There is no guarantee of a specific + * ordering of the elements in the array. + * + * @param databaseName name of database. + * @return a list of table details. + * @throws NoSuchResourceException Exception thrown on HTTP 404 means the database not exists + * @throws ForbiddenException Exception thrown on HTTP 403 means don't have the permission for + * this database + */ + public List listTableDetails(String databaseName) { + return listDataFromPageApi( + queryParams -> + client.get( + resourcePaths.tableDetails(databaseName), + queryParams, + ListTableDetailsResponse.class, + restAuthFunction)); + } + /** * List table for a catalog. * diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java index 740b52e7a12f..fb6fe21ac3eb 100644 --- a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java +++ b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java @@ -330,6 +330,19 @@ protected PagedList listTableDetailsPagedImpl( pagedTableNames.getNextPageToken()); } + @Override + public List
listTableDetails(String databaseName) throws DatabaseNotExistException { + List
result = new ArrayList<>(); + for (String tableName : listTables(databaseName)) { + try { + result.add(getTable(Identifier.create(databaseName, tableName))); + } catch (TableNotExistException e) { + // ignore + } + } + return result; + } + @Override public void dropTable(Identifier identifier, boolean ignoreIfNotExists) throws TableNotExistException { diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java index 192dbd33acc0..72d35c7a76be 100644 --- a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java +++ b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java @@ -232,6 +232,17 @@ PagedList
listTableDetailsPaged( @Nullable String tableType) throws DatabaseNotExistException; + /** + * Get list of table details under this database. An empty list is returned if none exists. + * + *

NOTE: System tables will not be listed. + * + * @param databaseName Name of the database to list table details. + * @return a list of the details of all tables in this database. + * @throws DatabaseNotExistException if the database does not exist + */ + List

listTableDetails(String databaseName) throws DatabaseNotExistException; + /** * Gets an array of tables for a catalog. * diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java b/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java index 623993444fbf..12505698db7f 100644 --- a/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java +++ b/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java @@ -126,6 +126,11 @@ public PagedList
listTableDetailsPaged( databaseName, maxResults, pageToken, tableNamePattern, tableType); } + @Override + public List
listTableDetails(String databaseName) throws DatabaseNotExistException { + return wrapped.listTableDetails(databaseName); + } + @Override public PagedList listTablesPagedGlobally( String databaseNamePattern, diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java b/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java index 46262601d89b..30e53de66b3b 100644 --- a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java +++ b/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java @@ -266,6 +266,16 @@ public PagedList
listTableDetailsPaged( } } + @Override + public List
listTableDetails(String databaseName) throws DatabaseNotExistException { + try { + List tables = api.listTableDetails(databaseName); + return tables.stream().map(t -> toTable(databaseName, t)).collect(Collectors.toList()); + } catch (NoSuchResourceException e) { + throw new DatabaseNotExistException(databaseName); + } + } + @Override public PagedList listTablesPagedGlobally( @Nullable String databaseNamePattern, diff --git a/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java b/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java index 2bf7d25a8cb4..8c5fdf545974 100644 --- a/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java +++ b/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java @@ -736,6 +736,32 @@ public void testListTableDetailsPagedWithTableType() throws Exception { assertThat(nonExistentTypeWithMaxResults.getNextPageToken()).isNull(); } + @Test + public void testListTableDetails() throws Exception { + // List table details returns an empty list when there are no tables in the database + String databaseName = "table_details_db"; + catalog.createDatabase(databaseName, false); + List
tableDetails = catalog.listTableDetails(databaseName); + assertThat(tableDetails).isEmpty(); + + String[] tableNames = {"table1", "table2", "table3", "abd", "def", "opr", "table_name"}; + String[] expectedTableNames = Arrays.stream(tableNames).sorted().toArray(String[]::new); + for (String tableName : tableNames) { + catalog.createTable( + Identifier.create(databaseName, tableName), DEFAULT_TABLE_SCHEMA, false); + } + + tableDetails = catalog.listTableDetails(databaseName); + assertThat(tableDetails).hasSize(tableNames.length); + List actualTableNames = + tableDetails.stream().map(Table::name).sorted().collect(Collectors.toList()); + assertThat(actualTableNames).containsExactly(expectedTableNames); + + // List table details throws DatabaseNotExistException when the database does not exist + assertThatExceptionOfType(Catalog.DatabaseNotExistException.class) + .isThrownBy(() -> catalog.listTableDetails("non_existing_db")); + } + @Test public void testListTablesPagedWithTableType() throws Exception { String databaseName = "tables_paged_table_type_db";