diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/MixedAndIcebergTableDescriptor.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/MixedAndIcebergTableDescriptor.java index 3db518a241..4dfdd83670 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/MixedAndIcebergTableDescriptor.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/MixedAndIcebergTableDescriptor.java @@ -83,6 +83,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -337,7 +339,7 @@ private void collectSnapshots( @Override public List getSnapshotDetail( - AmoroTable amoroTable, String snapshotId) { + AmoroTable amoroTable, String snapshotId, @Nullable String ref) { MixedTable mixedTable = getTable(amoroTable); List result = new ArrayList<>(); long commitId = Long.parseLong(snapshotId); diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/ServerTableDescriptor.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/ServerTableDescriptor.java index 8caa17e685..2eb7da70e6 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/ServerTableDescriptor.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/ServerTableDescriptor.java @@ -80,10 +80,10 @@ public List getSnapshots( } public List getSnapshotDetail( - TableIdentifier tableIdentifier, String snapshotId) { + TableIdentifier tableIdentifier, String snapshotId, String ref) { AmoroTable amoroTable = loadTable(tableIdentifier); FormatTableDescriptor formatTableDescriptor = formatDescriptorMap.get(amoroTable.format()); - return formatTableDescriptor.getSnapshotDetail(amoroTable, snapshotId); + return formatTableDescriptor.getSnapshotDetail(amoroTable, snapshotId, ref); } public List getTableOperations(TableIdentifier tableIdentifier) { diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java index 09544a3627..d7d005d5ad 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/TableController.java @@ -398,10 +398,13 @@ public void getSnapshotDetail(Context ctx) { String snapshotId = ctx.pathParam("snapshotId"); Integer page = ctx.queryParamAsClass("page", Integer.class).getOrDefault(1); Integer pageSize = ctx.queryParamAsClass("pageSize", Integer.class).getOrDefault(20); + String ref = ctx.queryParamAsClass("ref", String.class).getOrDefault(null); List result = tableDescriptor.getSnapshotDetail( - TableIdentifier.of(catalog, database, tableName).buildTableIdentifier(), snapshotId); + TableIdentifier.of(catalog, database, tableName).buildTableIdentifier(), + snapshotId, + ref); int offset = (page - 1) * pageSize; PageResult amsPageResult = PageResult.of(result, offset, pageSize); ctx.json(OkResponse.of(amsPageResult)); diff --git a/amoro-common/src/main/java/org/apache/amoro/table/descriptor/FormatTableDescriptor.java b/amoro-common/src/main/java/org/apache/amoro/table/descriptor/FormatTableDescriptor.java index baee06a366..03bbea7938 100644 --- a/amoro-common/src/main/java/org/apache/amoro/table/descriptor/FormatTableDescriptor.java +++ b/amoro-common/src/main/java/org/apache/amoro/table/descriptor/FormatTableDescriptor.java @@ -46,7 +46,8 @@ List getSnapshots( AmoroTable amoroTable, String ref, OperationType operationType); /** Get the snapshot detail information of the {@link AmoroTable}. */ - List getSnapshotDetail(AmoroTable amoroTable, String snapshotId); + List getSnapshotDetail( + AmoroTable amoroTable, String snapshotId, String ref); /** Get the DDL information of the {@link AmoroTable}. */ List getTableOperations(AmoroTable amoroTable); diff --git a/amoro-format-hudi/src/main/java/org/apache/amoro/formats/hudi/HudiTableDescriptor.java b/amoro-format-hudi/src/main/java/org/apache/amoro/formats/hudi/HudiTableDescriptor.java index 642a0714bf..5b79b37bea 100644 --- a/amoro-format-hudi/src/main/java/org/apache/amoro/formats/hudi/HudiTableDescriptor.java +++ b/amoro-format-hudi/src/main/java/org/apache/amoro/formats/hudi/HudiTableDescriptor.java @@ -74,6 +74,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; + import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; @@ -244,7 +246,7 @@ public List getSnapshots( @Override public List getSnapshotDetail( - AmoroTable amoroTable, String snapshotId) { + AmoroTable amoroTable, String snapshotId, @Nullable String ref) { HoodieJavaTable hoodieTable = (HoodieJavaTable) amoroTable.originalTable(); SyncableFileSystemView fileSystemView = hoodieTable.getHoodieView(); Map> ptFsMap = diff --git a/amoro-format-paimon/src/main/java/org/apache/amoro/formats/paimon/PaimonTableDescriptor.java b/amoro-format-paimon/src/main/java/org/apache/amoro/formats/paimon/PaimonTableDescriptor.java index 473488f471..d94ddc937d 100644 --- a/amoro-format-paimon/src/main/java/org/apache/amoro/formats/paimon/PaimonTableDescriptor.java +++ b/amoro-format-paimon/src/main/java/org/apache/amoro/formats/paimon/PaimonTableDescriptor.java @@ -24,7 +24,6 @@ import org.apache.amoro.TableFormat; import org.apache.amoro.api.CommitMetaProducer; import org.apache.amoro.process.ProcessStatus; -import org.apache.amoro.shade.guava32.com.google.common.collect.ImmutableList; import org.apache.amoro.shade.guava32.com.google.common.collect.Lists; import org.apache.amoro.shade.guava32.com.google.common.collect.Streams; import org.apache.amoro.table.TableIdentifier; @@ -59,7 +58,9 @@ import org.apache.paimon.manifest.ManifestList; import org.apache.paimon.table.DataTable; import org.apache.paimon.table.FileStoreTable; +import org.apache.paimon.utils.BranchManager; import org.apache.paimon.utils.FileStorePathFactory; +import org.apache.paimon.utils.SnapshotManager; import org.jetbrains.annotations.NotNull; import java.io.IOException; @@ -179,9 +180,10 @@ public List getSnapshots( FileStoreTable table = getTable(amoroTable); List snapshotsOfTables = new ArrayList<>(); Iterator snapshots; - if (PAIMON_MAIN_BRANCH_NAME.equals(ref)) { + if (table.branchManager().branchExists(ref) || BranchManager.isMainBranch(ref)) { + SnapshotManager snapshotManager = table.snapshotManager().copyWithBranch(ref); try { - snapshots = table.snapshotManager().snapshots(); + snapshots = snapshotManager.snapshots(); } catch (IOException e) { throw new RuntimeException(e); } @@ -221,11 +223,17 @@ public List getSnapshots( @Override public List getSnapshotDetail( - AmoroTable amoroTable, String snapshotId) { + AmoroTable amoroTable, String snapshotId, String ref) { FileStoreTable table = getTable(amoroTable); List amsDataFileInfos = new ArrayList<>(); long commitId = Long.parseLong(snapshotId); - Snapshot snapshot = table.snapshotManager().snapshot(commitId); + Snapshot snapshot; + if (BranchManager.isMainBranch(ref) || table.branchManager().branchExists(ref)) { + snapshot = table.snapshotManager().copyWithBranch(ref).snapshot(commitId); + } else { + snapshot = table.tagManager().tag(ref); + } + FileStore store = table.store(); FileStorePathFactory fileStorePathFactory = store.pathFactory(); ManifestList manifestList = store.manifestListFactory().create(); @@ -517,7 +525,14 @@ public List getTableTags(AmoroTable amoroTable) { @Override public List getTableBranches(AmoroTable amoroTable) { - return ImmutableList.of(TagOrBranchInfo.MAIN_BRANCH); + FileStoreTable table = getTable(amoroTable); + List branches = table.branchManager().branches(); + List branchInfos = + branches.stream() + .map(name -> new TagOrBranchInfo(name, -1, -1, 0L, 0L, TagOrBranchInfo.BRANCH)) + .collect(Collectors.toList()); + branchInfos.add(TagOrBranchInfo.MAIN_BRANCH); + return branchInfos; } @Override diff --git a/amoro-web/src/services/table.service.ts b/amoro-web/src/services/table.service.ts index 18d7f5b790..589f92d7b2 100644 --- a/amoro-web/src/services/table.service.ts +++ b/amoro-web/src/services/table.service.ts @@ -127,14 +127,15 @@ export function getDetailBySnapshotId( catalog: string db: string table: string + ref: string snapshotId: string page: number pageSize: number token?: string }, ) { - const { catalog, db, table, snapshotId, page, pageSize, token } = params - return request.get(`ams/v1/tables/catalogs/${catalog}/dbs/${db}/tables/${table}/snapshots/${snapshotId}/detail`, { params: { page, pageSize, token } }) + const { catalog, db, table, snapshotId, page, pageSize, ref, token } = params + return request.get(`ams/v1/tables/catalogs/${catalog}/dbs/${db}/tables/${table}/snapshots/${snapshotId}/detail`, { params: { page, pageSize, ref, token } }) } // get operations export function getOperations( diff --git a/amoro-web/src/views/tables/components/Snapshots.vue b/amoro-web/src/views/tables/components/Snapshots.vue index 219092439b..fef7e57685 100644 --- a/amoro-web/src/views/tables/components/Snapshots.vue +++ b/amoro-web/src/views/tables/components/Snapshots.vue @@ -157,6 +157,7 @@ async function getBreadcrumbTable() { const params = { ...sourceData, snapshotId: snapshotId.value, + ref: tblRef.value, page: breadcrumbPagination.current, pageSize: breadcrumbPagination.pageSize, }