This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push: new 33e04e4aca [vfs] Clean VFSIdentifier classes to remove unuse codes 33e04e4aca is described below commit 33e04e4aca8b4df4be7451f6e741d4676102ed56 Author: JingsongLi <jingsongl...@gmail.com> AuthorDate: Wed Jul 23 15:06:01 2025 +0800 [vfs] Clean VFSIdentifier classes to remove unuse codes --- .../apache/paimon/vfs/VFSCatalogIdentifier.java | 7 +- .../apache/paimon/vfs/VFSDatabaseIdentifier.java | 10 +- .../java/org/apache/paimon/vfs/VFSIdentifier.java | 25 +-- .../java/org/apache/paimon/vfs/VFSOperations.java | 35 ++-- .../org/apache/paimon/vfs/VFSTableIdentifier.java | 77 +++------ ...STableRootIdentifier.java => VFSTableInfo.java} | 34 ++-- .../paimon/vfs/VFSTableObjectIdentifier.java | 34 ++-- .../apache/paimon/vfs/VFSTableRootIdentifier.java | 24 +-- .../paimon/vfs/hadoop/PaimonVirtualFileSystem.java | 179 ++++++++++----------- .../paimon/vfs/hadoop/VirtualFileSystemTest.java | 1 + 10 files changed, 191 insertions(+), 235 deletions(-) diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSCatalogIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSCatalogIdentifier.java index 3118121b93..316e6da391 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSCatalogIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSCatalogIdentifier.java @@ -19,9 +19,4 @@ package org.apache.paimon.vfs; /** Identifier for catalog. */ -public class VFSCatalogIdentifier extends VFSIdentifier { - - public VFSCatalogIdentifier() { - super(VFSFileType.CATALOG, null); - } -} +public class VFSCatalogIdentifier implements VFSIdentifier {} diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSDatabaseIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSDatabaseIdentifier.java index 02a7390788..d52f12626d 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSDatabaseIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSDatabaseIdentifier.java @@ -19,9 +19,15 @@ package org.apache.paimon.vfs; /** Identifier for database. */ -public class VFSDatabaseIdentifier extends VFSIdentifier { +public class VFSDatabaseIdentifier implements VFSIdentifier { + + protected String databaseName; public VFSDatabaseIdentifier(String databaseName) { - super(VFSFileType.DATABASE, databaseName); + this.databaseName = databaseName; + } + + public String databaseName() { + return databaseName; } } diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSIdentifier.java index d454cec040..172cf856dc 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSIdentifier.java @@ -19,27 +19,4 @@ package org.apache.paimon.vfs; /** Identifier for virtual path. */ -public abstract class VFSIdentifier { - enum VFSFileType { - CATALOG, // pvfs://catalog/ - DATABASE, // pvfs://catalog/database/ - TABLE, // pvfs://catalog/database/table/ - TABLE_OBJECT // pvfs://catalog/database/table/file.txt - } - - protected VFSFileType vfsFileType; - protected String databaseName; - - public VFSIdentifier(VFSFileType vfsFileType, String databaseName) { - this.vfsFileType = vfsFileType; - this.databaseName = databaseName; - } - - public VFSFileType getVfsFileType() { - return vfsFileType; - } - - public String getDatabaseName() { - return databaseName; - } -} +public interface VFSIdentifier {} diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSOperations.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSOperations.java index 6ca09dc739..1fec65cd07 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSOperations.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSOperations.java @@ -40,6 +40,7 @@ import org.slf4j.LoggerFactory; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -73,42 +74,32 @@ public class VFSOperations { // parts.length >= 2: table or table object String databaseName = parts[0]; String tableName = parts[1]; + String relativePath = null; + if (parts.length > 2) { + relativePath = String.join("/", Arrays.copyOfRange(parts, 2, parts.length)); + } Identifier identifier = new Identifier(databaseName, tableName); // Get table from REST server GetTableResponse table; try { table = loadTableMetadata(identifier); } catch (FileNotFoundException e) { - if (parts.length == 2) { + if (relativePath == null) { return new VFSTableRootIdentifier(databaseName, tableName); } else { - return new VFSTableObjectIdentifier(databaseName, tableName); + return new VFSTableObjectIdentifier(databaseName, tableName, relativePath); } } if (table.isExternal()) { throw new IOException("Do not support visiting external table " + identifier); } - // Get real path - StringBuilder realPath = new StringBuilder(table.getPath()); - if (parts.length > 2) { - if (!table.getPath().endsWith("/")) { - realPath.append("/"); - } - for (int i = 2; i < parts.length; i++) { - realPath.append(parts[i]); - if (i < parts.length - 1) { - realPath.append("/"); - } - } - } - - FileIO fileIO = new RESTTokenFileIO(context, api, identifier, new Path(table.getPath())); - if (parts.length == 2) { - return new VFSTableRootIdentifier( - table, realPath.toString(), fileIO, databaseName, tableName); + Path tablePath = new Path(table.getPath()); + FileIO fileIO = new RESTTokenFileIO(context, api, identifier, tablePath); + VFSTableInfo tableInfo = new VFSTableInfo(table.getId(), tablePath, fileIO); + if (relativePath == null) { + return new VFSTableRootIdentifier(databaseName, tableName, tableInfo); } else { - return new VFSTableObjectIdentifier( - table, realPath.toString(), fileIO, databaseName, tableName); + return new VFSTableObjectIdentifier(databaseName, tableName, relativePath, tableInfo); } } diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableIdentifier.java index 86f0605322..60b065ca06 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableIdentifier.java @@ -18,82 +18,43 @@ package org.apache.paimon.vfs; -import org.apache.paimon.fs.FileIO; import org.apache.paimon.fs.Path; -import org.apache.paimon.rest.responses.GetTableResponse; -import java.net.URI; -import java.net.URISyntaxException; +import javax.annotation.Nullable; /** Identifier for table. */ -public abstract class VFSTableIdentifier extends VFSIdentifier { - protected Path realPath; - protected String scheme; - protected URI realUri; - protected String tableName; - protected GetTableResponse table; - protected FileIO fileIO; - protected String tableLocation; +public abstract class VFSTableIdentifier implements VFSIdentifier { + + protected final String databaseName; + protected final String tableName; + + protected final @Nullable VFSTableInfo tableInfo; // Constructor for non-exist table - public VFSTableIdentifier(VFSFileType vfsFileType, String databaseName, String tableName) { - super(vfsFileType, databaseName); - this.tableName = tableName; + public VFSTableIdentifier(String databaseName, String tableName) { + this(databaseName, tableName, null); } // Constructor for existing table public VFSTableIdentifier( - VFSFileType vfsFileType, - GetTableResponse table, - String realPath, - FileIO fileIO, - String databaseName, - String tableName) { - super(vfsFileType, databaseName); - this.realPath = new Path(realPath); - try { - this.realUri = new URI(realPath); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - this.scheme = realUri.getScheme(); + String databaseName, String tableName, @Nullable VFSTableInfo tableInfo) { + this.databaseName = databaseName; this.tableName = tableName; - this.table = table; - this.fileIO = fileIO; - if (table != null) { - this.tableLocation = table.getPath(); - } - } - - public Path getRealPath() { - return realPath; - } - - public URI getRealUri() { - return realUri; + this.tableInfo = tableInfo; } - public String getScheme() { - return scheme; + public String databaseName() { + return databaseName; } - public String getTableName() { + public String tableName() { return tableName; } - public GetTableResponse getTable() { - return table; - } - - public FileIO fileIO() { - return fileIO; + @Nullable + public VFSTableInfo tableInfo() { + return tableInfo; } - public String getTableLocation() { - return tableLocation; - } - - public boolean isTableExist() { - return table != null; - } + public abstract Path filePath(); } diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableInfo.java similarity index 60% copy from paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java copy to paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableInfo.java index ee398b06f6..f4003dc619 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableInfo.java @@ -19,20 +19,30 @@ package org.apache.paimon.vfs; import org.apache.paimon.fs.FileIO; -import org.apache.paimon.rest.responses.GetTableResponse; +import org.apache.paimon.fs.Path; -/** Identifier for objects under a table. */ -public class VFSTableRootIdentifier extends VFSTableIdentifier { - public VFSTableRootIdentifier(String databaseName, String tableName) { - super(VFSFileType.TABLE, databaseName, tableName); +/** Information for an existing table. */ +public class VFSTableInfo { + + private final String tableId; + private final Path tablePath; + private final FileIO fileIO; + + public VFSTableInfo(String tableId, Path tablePath, FileIO fileIO) { + this.tableId = tableId; + this.tablePath = tablePath; + this.fileIO = fileIO; + } + + public String tableId() { + return tableId; + } + + public Path tablePath() { + return tablePath; } - public VFSTableRootIdentifier( - GetTableResponse table, - String realPath, - FileIO fileIO, - String databaseName, - String tableName) { - super(VFSFileType.TABLE, table, realPath, fileIO, databaseName, tableName); + public FileIO fileIO() { + return fileIO; } } diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableObjectIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableObjectIdentifier.java index b0cdfbb1bb..395aa13ddd 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableObjectIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableObjectIdentifier.java @@ -18,21 +18,37 @@ package org.apache.paimon.vfs; -import org.apache.paimon.fs.FileIO; -import org.apache.paimon.rest.responses.GetTableResponse; +import org.apache.paimon.fs.Path; + +import javax.annotation.Nullable; + +import static org.apache.paimon.utils.Preconditions.checkNotNull; /** Identifier for objects under a table. */ public class VFSTableObjectIdentifier extends VFSTableIdentifier { - public VFSTableObjectIdentifier(String databaseName, String tableName) { - super(VFSFileType.TABLE_OBJECT, databaseName, tableName); + + private final String relativePath; + + public VFSTableObjectIdentifier(String databaseName, String tableName, String relativePath) { + this(databaseName, tableName, relativePath, null); } public VFSTableObjectIdentifier( - GetTableResponse table, - String realPath, - FileIO fileIO, String databaseName, - String tableName) { - super(VFSFileType.TABLE_OBJECT, table, realPath, fileIO, databaseName, tableName); + String tableName, + String relativePath, + @Nullable VFSTableInfo tableInfo) { + super(databaseName, tableName, tableInfo); + this.relativePath = relativePath; + } + + public String relativePath() { + return relativePath; + } + + @Override + public Path filePath() { + checkNotNull(tableInfo); + return new Path(tableInfo.tablePath(), relativePath); } } diff --git a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java index ee398b06f6..f73b008d7c 100644 --- a/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java +++ b/paimon-vfs/paimon-vfs-common/src/main/java/org/apache/paimon/vfs/VFSTableRootIdentifier.java @@ -18,21 +18,27 @@ package org.apache.paimon.vfs; -import org.apache.paimon.fs.FileIO; -import org.apache.paimon.rest.responses.GetTableResponse; +import org.apache.paimon.fs.Path; + +import javax.annotation.Nullable; + +import static org.apache.paimon.utils.Preconditions.checkNotNull; /** Identifier for objects under a table. */ public class VFSTableRootIdentifier extends VFSTableIdentifier { + public VFSTableRootIdentifier(String databaseName, String tableName) { - super(VFSFileType.TABLE, databaseName, tableName); + super(databaseName, tableName); } public VFSTableRootIdentifier( - GetTableResponse table, - String realPath, - FileIO fileIO, - String databaseName, - String tableName) { - super(VFSFileType.TABLE, table, realPath, fileIO, databaseName, tableName); + String databaseName, String tableName, @Nullable VFSTableInfo tableInfo) { + super(databaseName, tableName, tableInfo); + } + + @Override + public Path filePath() { + checkNotNull(tableInfo); + return tableInfo.tablePath(); } } diff --git a/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java b/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java index 1c0e8ceb39..e09679243c 100644 --- a/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java +++ b/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java @@ -22,12 +22,12 @@ import org.apache.paimon.fs.PositionOutputStream; import org.apache.paimon.options.CatalogOptions; import org.apache.paimon.options.Options; import org.apache.paimon.rest.responses.GetDatabaseResponse; -import org.apache.paimon.rest.responses.GetTableResponse; import org.apache.paimon.vfs.VFSCatalogIdentifier; import org.apache.paimon.vfs.VFSDatabaseIdentifier; import org.apache.paimon.vfs.VFSIdentifier; import org.apache.paimon.vfs.VFSOperations; import org.apache.paimon.vfs.VFSTableIdentifier; +import org.apache.paimon.vfs.VFSTableInfo; import org.apache.paimon.vfs.VFSTableObjectIdentifier; import org.apache.paimon.vfs.VFSTableRootIdentifier; @@ -102,18 +102,16 @@ public class PaimonVirtualFileSystem extends FileSystem { throw new IOException( "Cannot create file for table level virtual path " + f + " which is a table"); } else { - VFSTableObjectIdentifier vfsTableObjectIdentifier = - (VFSTableObjectIdentifier) vfsIdentifier; - if (!vfsTableObjectIdentifier.isTableExist()) { + VFSTableObjectIdentifier identifier = (VFSTableObjectIdentifier) vfsIdentifier; + VFSTableInfo tableInfo = identifier.tableInfo(); + if (tableInfo == null) { throw new IOException( "Cannot create a file for virtual path " + f + " which is not in an existing table"); } PositionOutputStream out = - vfsTableObjectIdentifier - .fileIO() - .newOutputStream(vfsTableObjectIdentifier.getRealPath(), overwrite); + tableInfo.fileIO().newOutputStream(identifier.filePath(), overwrite); return new FSDataOutputStream(out, statistics); } } @@ -131,9 +129,9 @@ public class PaimonVirtualFileSystem extends FileSystem { throw new FileNotFoundException( "Cannot open file for virtual path " + path + " which is a table"); } else { - VFSTableObjectIdentifier vfsTableObjectIdentifier = - (VFSTableObjectIdentifier) vfsIdentifier; - if (!vfsTableObjectIdentifier.isTableExist()) { + VFSTableObjectIdentifier identifier = (VFSTableObjectIdentifier) vfsIdentifier; + VFSTableInfo tableInfo = identifier.tableInfo(); + if (tableInfo == null) { throw new IOException( "Cannot open file for virtual path " + path @@ -141,10 +139,7 @@ public class PaimonVirtualFileSystem extends FileSystem { } VFSInputStream in = new VFSInputStream( - vfsTableObjectIdentifier - .fileIO() - .newInputStream(vfsTableObjectIdentifier.getRealPath()), - statistics); + tableInfo.fileIO().newInputStream(identifier.filePath()), statistics); return new FSDataInputStream(in); } } @@ -174,27 +169,27 @@ public class PaimonVirtualFileSystem extends FileSystem { (VFSTableRootIdentifier) srcVfsIdentifier, (VFSTableRootIdentifier) dstVfsIdentifier); } else { - if (!(dstVfsIdentifier instanceof VFSTableIdentifier)) { + if (!(dstVfsIdentifier instanceof VFSTableObjectIdentifier)) { throw new IOException( "Cannot rename to virtual path " + dst + " which is not a table"); } - VFSTableIdentifier srcTableIdentifier = (VFSTableIdentifier) srcVfsIdentifier; - VFSTableIdentifier dstTableIdentifier = (VFSTableIdentifier) dstVfsIdentifier; - if (!srcTableIdentifier.isTableExist()) { + VFSTableObjectIdentifier srcIdentifier = (VFSTableObjectIdentifier) srcVfsIdentifier; + VFSTableObjectIdentifier dstIdentifier = (VFSTableObjectIdentifier) dstVfsIdentifier; + VFSTableInfo srcTableInfo = srcIdentifier.tableInfo(); + VFSTableInfo dstTableInfo = dstIdentifier.tableInfo(); + if (srcTableInfo == null) { throw new IOException( "Cannot rename from virtual path " + src + " which is not in an existing table"); } - if (!dstTableIdentifier.isTableExist()) { + if (dstTableInfo == null) { throw new IOException( "Cannot rename to virtual path " + dst + " which is not in an existing table"); } - GetTableResponse srcTable = srcTableIdentifier.getTable(); - GetTableResponse dstTable = dstTableIdentifier.getTable(); - if (!srcTable.getId().equals(dstTable.getId())) { + if (!srcTableInfo.tableId().equals(dstTableInfo.tableId())) { throw new IOException( "Cannot rename from virtual path " + src @@ -202,43 +197,39 @@ public class PaimonVirtualFileSystem extends FileSystem { + dst + " which is not in the same table"); } - return srcTableIdentifier - .fileIO() - .rename(srcTableIdentifier.getRealPath(), dstTableIdentifier.getRealPath()); + return srcTableInfo.fileIO().rename(srcIdentifier.filePath(), dstIdentifier.filePath()); } } private boolean renameTable( VFSTableRootIdentifier srcIdentifier, VFSTableRootIdentifier dstIdentifier) throws IOException { - if (!srcIdentifier.getDatabaseName().equals(dstIdentifier.getDatabaseName())) { + if (!srcIdentifier.databaseName().equals(dstIdentifier.databaseName())) { throw new IOException("Do not support rename table with different database"); } - if (!srcIdentifier.isTableExist()) { + if (srcIdentifier.tableInfo() == null) { // return false if src does not exist LOG.debug( - "Source table not found " - + srcIdentifier.getDatabaseName() - + "." - + srcIdentifier.getTableName()); + "Source table not found {}.{}", + srcIdentifier.databaseName(), + srcIdentifier.tableName()); return false; } - if (srcIdentifier.getTableName().equals(dstIdentifier.getTableName())) { + if (srcIdentifier.tableName().equals(dstIdentifier.tableName())) { // src equals to dst, return true return true; } try { vfsOperations.renameTable( - srcIdentifier.getDatabaseName(), - srcIdentifier.getTableName(), - dstIdentifier.getTableName()); + srcIdentifier.databaseName(), + srcIdentifier.tableName(), + dstIdentifier.tableName()); return true; } catch (FileNotFoundException e) { LOG.debug( - "Source table not found " - + srcIdentifier.getDatabaseName() - + "." - + srcIdentifier.getTableName()); + "Source table not found {}.{}", + srcIdentifier.databaseName(), + srcIdentifier.tableName()); return false; } } @@ -249,8 +240,9 @@ public class PaimonVirtualFileSystem extends FileSystem { if (vfsIdentifier instanceof VFSCatalogIdentifier) { throw new IOException("Cannot delete virtual path " + f + " which is a catalog"); } else if (vfsIdentifier instanceof VFSDatabaseIdentifier) { + String databaseName = ((VFSDatabaseIdentifier) vfsIdentifier).databaseName(); try { - vfsOperations.dropDatabase(vfsIdentifier.getDatabaseName(), recursive); + vfsOperations.dropDatabase(databaseName, recursive); } catch (FileNotFoundException e) { LOG.debug("Database not found for deleting path " + f); return false; @@ -260,23 +252,20 @@ public class PaimonVirtualFileSystem extends FileSystem { VFSTableRootIdentifier vfsTableRootIdentifier = (VFSTableRootIdentifier) vfsIdentifier; try { vfsOperations.dropTable( - vfsTableRootIdentifier.getDatabaseName(), - vfsTableRootIdentifier.getTableName()); + vfsTableRootIdentifier.databaseName(), vfsTableRootIdentifier.tableName()); } catch (FileNotFoundException e) { LOG.debug("Table not found for deleting path " + f); return false; } return true; } else { - VFSTableObjectIdentifier vfsTableObjectIdentifier = - (VFSTableObjectIdentifier) vfsIdentifier; - if (!vfsTableObjectIdentifier.isTableExist()) { + VFSTableObjectIdentifier identifier = (VFSTableObjectIdentifier) vfsIdentifier; + VFSTableInfo tableInfo = identifier.tableInfo(); + if (tableInfo == null) { throw new IOException( "Cannot delete virtual path " + f + " which is not in an existing table"); } - return vfsTableObjectIdentifier - .fileIO() - .delete(vfsTableObjectIdentifier.getRealPath(), recursive); + return tableInfo.fileIO().delete(identifier.filePath(), recursive); } } @@ -286,17 +275,19 @@ public class PaimonVirtualFileSystem extends FileSystem { if (vfsIdentifier instanceof VFSCatalogIdentifier) { return new FileStatus(0, true, 1, 1, 0, new Path(this.uri)); } else if (vfsIdentifier instanceof VFSDatabaseIdentifier) { - GetDatabaseResponse database = - vfsOperations.getDatabase(vfsIdentifier.getDatabaseName()); + String databaseName = ((VFSDatabaseIdentifier) vfsIdentifier).databaseName(); + GetDatabaseResponse database = vfsOperations.getDatabase(databaseName); return convertDatabase(database); } else { - VFSTableIdentifier vfsTableIdentifier = (VFSTableIdentifier) vfsIdentifier; - if (!vfsTableIdentifier.isTableExist()) { + VFSTableIdentifier identifier = (VFSTableIdentifier) vfsIdentifier; + VFSTableInfo tableInfo = identifier.tableInfo(); + if (tableInfo == null) { throw new FileNotFoundException("Table not found for path " + f); } org.apache.paimon.fs.FileStatus fileStatus = - vfsTableIdentifier.fileIO().getFileStatus(vfsTableIdentifier.getRealPath()); - return convertFileStatus(vfsTableIdentifier, fileStatus); + tableInfo.fileIO().getFileStatus(identifier.filePath()); + return convertFileStatus( + identifier.databaseName(), identifier.tableName(), tableInfo, fileStatus); } } @@ -305,33 +296,28 @@ public class PaimonVirtualFileSystem extends FileSystem { } private FileStatus convertFileStatus( - VFSTableIdentifier vfsIdentifier, org.apache.paimon.fs.FileStatus paimonFileStatus) + String databaseName, + String tableName, + VFSTableInfo tableInfo, + org.apache.paimon.fs.FileStatus fileStatus) throws IOException { - String realPath = paimonFileStatus.getPath().toString(); - if (!realPath.startsWith(vfsIdentifier.getTableLocation())) { + String tablePath = tableInfo.tablePath().toString(); + String filePath = fileStatus.getPath().toString(); + if (!filePath.startsWith(tablePath)) { throw new IOException( - "Result path " - + realPath - + " does not start with table location " - + vfsIdentifier.getTableLocation()); + "Result path " + filePath + " does not start with table location " + tablePath); } - String childPath = realPath.substring(vfsIdentifier.getTableLocation().length()); + String childPath = filePath.substring(tablePath.length()); if (!childPath.startsWith("/")) { childPath = "/" + childPath; } - Path virtualPath = - new Path( - new Path(this.uri), - vfsIdentifier.getDatabaseName() - + "/" - + vfsIdentifier.getTableName() - + childPath); + Path virtualPath = new Path(new Path(this.uri), databaseName + "/" + tableName + childPath); return new FileStatus( - paimonFileStatus.getLen(), - paimonFileStatus.isDir(), + fileStatus.getLen(), + fileStatus.isDir(), 1, 1, - paimonFileStatus.getModificationTime(), + fileStatus.getModificationTime(), virtualPath); } @@ -342,16 +328,19 @@ public class PaimonVirtualFileSystem extends FileSystem { List<String> databases = vfsOperations.listDatabases(); return convertDatabases(databases); } else if (vfsIdentifier instanceof VFSDatabaseIdentifier) { - List<String> tables = vfsOperations.listTables(vfsIdentifier.getDatabaseName()); - return convertTables(vfsIdentifier.getDatabaseName(), tables); + String databaseName = ((VFSDatabaseIdentifier) vfsIdentifier).databaseName(); + List<String> tables = vfsOperations.listTables(databaseName); + return convertTables(databaseName, tables); } else { - VFSTableIdentifier vfsTableIdentifier = (VFSTableIdentifier) vfsIdentifier; - if (!vfsTableIdentifier.isTableExist()) { + VFSTableIdentifier identifier = (VFSTableIdentifier) vfsIdentifier; + VFSTableInfo tableInfo = identifier.tableInfo(); + if (tableInfo == null) { throw new FileNotFoundException("Table not found for path " + f); } - org.apache.paimon.fs.FileStatus[] paimonFileStatuses = - vfsTableIdentifier.fileIO().listStatus(vfsTableIdentifier.getRealPath()); - return convertFileStatuses(vfsTableIdentifier, paimonFileStatuses); + org.apache.paimon.fs.FileStatus[] fileStatuses = + tableInfo.fileIO().listStatus(identifier.filePath()); + return convertFileStatuses( + identifier.databaseName(), identifier.tableName(), tableInfo, fileStatuses); } } @@ -379,13 +368,17 @@ public class PaimonVirtualFileSystem extends FileSystem { } private FileStatus[] convertFileStatuses( - VFSTableIdentifier vfsIdentifier, org.apache.paimon.fs.FileStatus[] paimonFileStatuses) + String databaseName, + String tableName, + VFSTableInfo tableInfo, + org.apache.paimon.fs.FileStatus[] fileStatuses) throws IOException { - FileStatus[] fileStatuses = new FileStatus[paimonFileStatuses.length]; - for (int i = 0; i < paimonFileStatuses.length; i++) { - fileStatuses[i] = convertFileStatus(vfsIdentifier, paimonFileStatuses[i]); + FileStatus[] virtualStatues = new FileStatus[fileStatuses.length]; + for (int i = 0; i < fileStatuses.length; i++) { + virtualStatues[i] = + convertFileStatus(databaseName, tableName, tableInfo, fileStatuses[i]); } - return fileStatuses; + return virtualStatues; } @Override @@ -394,27 +387,27 @@ public class PaimonVirtualFileSystem extends FileSystem { if (vfsIdentifier instanceof VFSCatalogIdentifier) { throw new IOException("Cannot mkdirs for virtual path " + f + " which is a catalog"); } else if (vfsIdentifier instanceof VFSDatabaseIdentifier) { - vfsOperations.createDatabase(vfsIdentifier.getDatabaseName()); + String databaseName = ((VFSDatabaseIdentifier) vfsIdentifier).databaseName(); + vfsOperations.createDatabase(databaseName); return true; } else if (vfsIdentifier instanceof VFSTableRootIdentifier) { - VFSTableRootIdentifier vfsTableRootIdentifier = (VFSTableRootIdentifier) vfsIdentifier; - if (vfsTableRootIdentifier.isTableExist()) { + VFSTableRootIdentifier identifier = (VFSTableRootIdentifier) vfsIdentifier; + if (identifier.tableInfo() != null) { // Table already exists, no need to execute return true; } - vfsOperations.createObjectTable( - vfsIdentifier.getDatabaseName(), vfsTableRootIdentifier.getTableName()); + vfsOperations.createObjectTable(identifier.databaseName(), identifier.tableName()); return true; } else { - VFSTableObjectIdentifier vfsTableObjectIdentifier = - (VFSTableObjectIdentifier) vfsIdentifier; - if (!vfsTableObjectIdentifier.isTableExist()) { + VFSTableObjectIdentifier identifier = (VFSTableObjectIdentifier) vfsIdentifier; + VFSTableInfo tableInfo = identifier.tableInfo(); + if (tableInfo == null) { throw new IOException( "Cannot mkdirs for virtual path " + f + " which is not in an existing table"); } - return vfsTableObjectIdentifier.fileIO().mkdirs(vfsTableObjectIdentifier.getRealPath()); + return tableInfo.fileIO().mkdirs(identifier.filePath()); } } diff --git a/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java b/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java index 8b63cc187d..24c817eb20 100644 --- a/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java +++ b/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java @@ -54,6 +54,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** Test for {@link PaimonVirtualFileSystem}. */ public abstract class VirtualFileSystemTest { + @TempDir java.nio.file.Path tempFile; protected String warehouse; protected FileIO fileIO;