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/incubator-paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 437d421d0 [core] Make PrimaryKeyFileStoreTable and 
AppendOnlyFileStoreTable package private (#2791)
437d421d0 is described below

commit 437d421d0290f07fbbd01adf118a0e660b5bb66f
Author: tsreaper <[email protected]>
AuthorDate: Thu Jan 25 16:32:11 2024 +0800

    [core] Make PrimaryKeyFileStoreTable and AppendOnlyFileStoreTable package 
private (#2791)
---
 .../AppendOnlyTableCompactionCoordinator.java      | 25 ++++++-----
 .../paimon/table/AppendOnlyFileStoreTable.java     |  2 +-
 .../paimon/table/PrimaryKeyFileStoreTable.java     |  2 +-
 .../AppendOnlyTableCompactionCoordinatorTest.java  | 11 ++---
 .../append/AppendOnlyTableCompactionITTest.java    | 13 +++---
 .../operation/AppendOnlyFileStoreWriteTest.java    | 10 ++---
 .../org/apache/paimon/table/TableTestBase.java     |  4 +-
 .../paimon/flink/sink/cdc/CdcSinkBuilder.java      |  4 +-
 .../flink/sink/cdc/CdcUnawareBucketSink.java       |  4 +-
 .../sink/cdc/FlinkCdcSyncDatabaseSinkBuilder.java  |  3 +-
 .../apache/paimon/flink/action/CompactAction.java  |  6 +--
 .../paimon/flink/action/CompactDatabaseAction.java | 25 +++++------
 .../UnawareBucketCompactionTopoBuilder.java        |  8 ++--
 .../AppendOnlyTableCompactionWorkerOperator.java   |  9 ++--
 .../apache/paimon/flink/sink/FlinkSinkBuilder.java |  9 +---
 .../paimon/flink/sink/FlinkTableSinkBase.java      |  9 +---
 .../paimon/flink/sink/RowUnawareBucketSink.java    |  4 +-
 .../SupportsRowLevelOperationFlinkTableSink.java   | 20 ++-------
 .../flink/sink/UnawareBucketCompactionSink.java    |  8 ++--
 .../paimon/flink/sink/UnawareBucketSink.java       |  6 +--
 .../flink/source/BucketUnawareCompactSource.java   |  6 +--
 .../paimon/flink/source/DataTableSource.java       | 11 +----
 .../SortCompactActionForDynamicBucketITCase.java   | 48 ++++++++--------------
 .../SortCompactActionForUnawareBucketITCase.java   | 44 ++++++++------------
 ...ppendOnlyTableCompactionWorkerOperatorTest.java |  9 ++--
 .../statistics/AppendOnlyTableStatisticsTest.java  |  3 +-
 .../statistics/PrimaryKeyTableStatisticsTest.java  |  5 +--
 .../apache/paimon/hive/migrate/HiveMigrator.java   |  3 +-
 .../paimon/spark/procedure/CompactProcedure.java   |  7 ++--
 .../apache/paimon/spark/PaimonScanBuilder.scala    |  5 +--
 .../spark/catalyst/analysis/RowLevelHelper.scala   | 15 +++----
 31 files changed, 126 insertions(+), 212 deletions(-)

diff --git 
a/paimon-core/src/main/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinator.java
 
b/paimon-core/src/main/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinator.java
index e37d57336..614544ff1 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinator.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinator.java
@@ -23,11 +23,11 @@ import org.apache.paimon.annotation.VisibleForTesting;
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.io.DataFileMeta;
 import org.apache.paimon.predicate.Predicate;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.source.DataSplit;
 import org.apache.paimon.table.source.InnerTableScan;
 import org.apache.paimon.table.source.Split;
+import org.apache.paimon.utils.Preconditions;
 
 import javax.annotation.Nullable;
 
@@ -41,14 +41,14 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
- * {@link AppendOnlyFileStoreTable} compact coordinator.
+ * Compact coordinator for append only tables.
  *
- * <p>Note: AppendOnlyTableCompactionCoordinator scan files in snapshot, read 
APPEND and COMPACT
- * snapshot then load those new files. It will try it best to generate 
compaction task for the
- * restored files scanned in snapshot, but to reduce memory usage, it won't 
remain single file for a
- * long time. After ten times scan, single file with one partition will be 
ignored and removed from
- * memory, which means, it will not participate in compaction again until 
restart the compaction
- * job.
+ * <p>Note: {@link AppendOnlyTableCompactionCoordinator} scan files in 
snapshot, read APPEND and
+ * COMPACT snapshot then load those new files. It will try it best to generate 
compaction task for
+ * the restored files scanned in snapshot, but to reduce memory usage, it 
won't remain single file
+ * for a long time. After ten times scan, single file with one partition will 
be ignored and removed
+ * from memory, which means, it will not participate in compaction again until 
restart the
+ * compaction job.
  *
  * <p>When a third task delete file in latest snapshot(including batch 
delete/update and overwrite),
  * the file in coordinator will still remain and participate in compaction 
task. When this happens,
@@ -70,18 +70,17 @@ public class AppendOnlyTableCompactionCoordinator {
     final Map<BinaryRow, PartitionCompactCoordinator> 
partitionCompactCoordinators =
             new HashMap<>();
 
-    public AppendOnlyTableCompactionCoordinator(AppendOnlyFileStoreTable 
table) {
+    public AppendOnlyTableCompactionCoordinator(FileStoreTable table) {
         this(table, true);
     }
 
-    public AppendOnlyTableCompactionCoordinator(
-            AppendOnlyFileStoreTable table, boolean isStreaming) {
+    public AppendOnlyTableCompactionCoordinator(FileStoreTable table, boolean 
isStreaming) {
         this(table, isStreaming, null);
     }
 
     public AppendOnlyTableCompactionCoordinator(
-            AppendOnlyFileStoreTable table, boolean isStreaming, @Nullable 
Predicate filter) {
-
+            FileStoreTable table, boolean isStreaming, @Nullable Predicate 
filter) {
+        Preconditions.checkArgument(table.primaryKeys().isEmpty());
         FileStoreTable tableCopy = table.copy(compactScanType());
         if (isStreaming) {
             scan = tableCopy.newStreamScan();
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/table/AppendOnlyFileStoreTable.java
 
b/paimon-core/src/main/java/org/apache/paimon/table/AppendOnlyFileStoreTable.java
index 678453729..915ab1544 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/table/AppendOnlyFileStoreTable.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/table/AppendOnlyFileStoreTable.java
@@ -47,7 +47,7 @@ import java.io.IOException;
 import java.util.function.BiConsumer;
 
 /** {@link FileStoreTable} for append table. */
-public class AppendOnlyFileStoreTable extends AbstractFileStoreTable {
+class AppendOnlyFileStoreTable extends AbstractFileStoreTable {
 
     private static final long serialVersionUID = 1L;
 
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/table/PrimaryKeyFileStoreTable.java
 
b/paimon-core/src/main/java/org/apache/paimon/table/PrimaryKeyFileStoreTable.java
index d815aae9f..a1614765e 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/table/PrimaryKeyFileStoreTable.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/table/PrimaryKeyFileStoreTable.java
@@ -56,7 +56,7 @@ import static 
org.apache.paimon.predicate.PredicateBuilder.pickTransformFieldMap
 import static org.apache.paimon.predicate.PredicateBuilder.splitAnd;
 
 /** {@link FileStoreTable} for primary key table. */
-public class PrimaryKeyFileStoreTable extends AbstractFileStoreTable {
+class PrimaryKeyFileStoreTable extends AbstractFileStoreTable {
 
     private static final long serialVersionUID = 1L;
 
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinatorTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinatorTest.java
index 83e5be14c..0b00cfefa 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinatorTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionCoordinatorTest.java
@@ -26,7 +26,7 @@ import org.apache.paimon.io.DataFileMeta;
 import org.apache.paimon.schema.Schema;
 import org.apache.paimon.schema.SchemaManager;
 import org.apache.paimon.schema.TableSchema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.FileStoreTableFactory;
 import org.apache.paimon.types.DataTypes;
 
@@ -48,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 public class AppendOnlyTableCompactionCoordinatorTest {
 
     @TempDir Path tempDir;
-    private AppendOnlyFileStoreTable appendOnlyFileStoreTable;
+    private FileStoreTable appendOnlyFileStoreTable;
     private AppendOnlyTableCompactionCoordinator compactionCoordinator;
     private BinaryRow partition;
 
@@ -159,11 +159,8 @@ public class AppendOnlyTableCompactionCoordinatorTest {
         TableSchema tableSchema = schemaManager.createTable(schema());
 
         appendOnlyFileStoreTable =
-                (AppendOnlyFileStoreTable)
-                        FileStoreTableFactory.create(
-                                fileIO,
-                                new 
org.apache.paimon.fs.Path(tempDir.toString()),
-                                tableSchema);
+                FileStoreTableFactory.create(
+                        fileIO, new 
org.apache.paimon.fs.Path(tempDir.toString()), tableSchema);
         compactionCoordinator = new 
AppendOnlyTableCompactionCoordinator(appendOnlyFileStoreTable);
         partition = BinaryRow.EMPTY_ROW;
     }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionITTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionITTest.java
index f0a13d9fa..a67a081a0 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionITTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/append/AppendOnlyTableCompactionITTest.java
@@ -28,7 +28,7 @@ import org.apache.paimon.operation.AppendOnlyFileStoreWrite;
 import org.apache.paimon.schema.Schema;
 import org.apache.paimon.schema.SchemaManager;
 import org.apache.paimon.schema.TableSchema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.FileStoreTableFactory;
 import org.apache.paimon.table.sink.CommitMessage;
 import org.apache.paimon.table.sink.CommitMessageImpl;
@@ -53,7 +53,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 public class AppendOnlyTableCompactionITTest {
 
     @TempDir private Path tempDir;
-    private AppendOnlyFileStoreTable appendOnlyFileStoreTable;
+    private FileStoreTable appendOnlyFileStoreTable;
     private SnapshotManager snapshotManager;
     private AppendOnlyTableCompactionCoordinator compactionCoordinator;
     private AppendOnlyFileStoreWrite write;
@@ -188,12 +188,9 @@ public class AppendOnlyTableCompactionITTest {
         TableSchema tableSchema = schemaManager.createTable(schema());
         snapshotManager = new SnapshotManager(fileIO, path);
         appendOnlyFileStoreTable =
-                (AppendOnlyFileStoreTable)
-                        FileStoreTableFactory.create(
-                                fileIO,
-                                new 
org.apache.paimon.fs.Path(tempDir.toString()),
-                                tableSchema);
+                FileStoreTableFactory.create(
+                        fileIO, new 
org.apache.paimon.fs.Path(tempDir.toString()), tableSchema);
         compactionCoordinator = new 
AppendOnlyTableCompactionCoordinator(appendOnlyFileStoreTable);
-        write = appendOnlyFileStoreTable.store().newWrite(commitUser);
+        write = (AppendOnlyFileStoreWrite) 
appendOnlyFileStoreTable.store().newWrite(commitUser);
     }
 }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/operation/AppendOnlyFileStoreWriteTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/operation/AppendOnlyFileStoreWriteTest.java
index 661a2a76c..9281a7b35 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/operation/AppendOnlyFileStoreWriteTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/operation/AppendOnlyFileStoreWriteTest.java
@@ -31,7 +31,7 @@ import org.apache.paimon.fs.Path;
 import org.apache.paimon.fs.local.LocalFileIO;
 import org.apache.paimon.io.DataFileMeta;
 import org.apache.paimon.schema.Schema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.sink.CommitMessage;
 import org.apache.paimon.table.sink.CommitMessageImpl;
 import org.apache.paimon.types.DataTypes;
@@ -50,9 +50,9 @@ public class AppendOnlyFileStoreWriteTest {
 
     @Test
     public void testWritesInBatch() throws Exception {
-        AppendOnlyFileStoreTable table = createFileStoreTable();
+        FileStoreTable table = createFileStoreTable();
 
-        AppendOnlyFileStoreWrite write = table.store().newWrite("ss");
+        AppendOnlyFileStoreWrite write = (AppendOnlyFileStoreWrite) 
table.store().newWrite("ss");
         write.withExecutionMode(false);
 
         write.write(partition(0), 0, GenericRow.of(0, 0, 0));
@@ -101,7 +101,7 @@ public class AppendOnlyFileStoreWriteTest {
         Assertions.assertThat(records).isEqualTo(11);
     }
 
-    protected AppendOnlyFileStoreTable createFileStoreTable() throws Exception 
{
+    protected FileStoreTable createFileStoreTable() throws Exception {
         Catalog catalog = new FileSystemCatalog(LocalFileIO.create(), new 
Path(tempDir.toString()));
         Schema schema =
                 Schema.newBuilder()
@@ -114,7 +114,7 @@ public class AppendOnlyFileStoreWriteTest {
         Identifier identifier = Identifier.create("default", "test");
         catalog.createDatabase("default", false);
         catalog.createTable(identifier, schema, false);
-        return (AppendOnlyFileStoreTable) catalog.getTable(identifier);
+        return (FileStoreTable) catalog.getTable(identifier);
     }
 
     private BinaryRow partition(int i) {
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/table/TableTestBase.java 
b/paimon-core/src/test/java/org/apache/paimon/table/TableTestBase.java
index 09b6121b1..4be85e5cb 100644
--- a/paimon-core/src/test/java/org/apache/paimon/table/TableTestBase.java
+++ b/paimon-core/src/test/java/org/apache/paimon/table/TableTestBase.java
@@ -185,8 +185,8 @@ public abstract class TableTestBase {
         return messages;
     }
 
-    public Table getTableDefault() throws Exception {
-        return catalog.getTable(identifier());
+    public FileStoreTable getTableDefault() throws Exception {
+        return (FileStoreTable) catalog.getTable(identifier());
     }
 
     private List<CommitMessage> writeOnce(Table table, int time, int size) 
throws Exception {
diff --git 
a/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcSinkBuilder.java
 
b/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcSinkBuilder.java
index 380cdffb8..0c60ea265 100644
--- 
a/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcSinkBuilder.java
+++ 
b/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcSinkBuilder.java
@@ -23,7 +23,6 @@ import org.apache.paimon.catalog.Catalog;
 import org.apache.paimon.catalog.Identifier;
 import org.apache.paimon.flink.utils.SingleOutputStreamOperatorUtils;
 import org.apache.paimon.schema.SchemaManager;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.BucketMode;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.Table;
@@ -135,7 +134,6 @@ public class CdcSinkBuilder<T> {
 
     private DataStreamSink<?> buildForUnawareBucket(DataStream<CdcRecord> 
parsed) {
         FileStoreTable dataTable = (FileStoreTable) table;
-        return new CdcUnawareBucketSink((AppendOnlyFileStoreTable) dataTable, 
parallelism)
-                .sinkFrom(parsed);
+        return new CdcUnawareBucketSink(dataTable, 
parallelism).sinkFrom(parsed);
     }
 }
diff --git 
a/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcUnawareBucketSink.java
 
b/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcUnawareBucketSink.java
index 5c6c1d363..5cd3d6085 100644
--- 
a/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcUnawareBucketSink.java
+++ 
b/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/CdcUnawareBucketSink.java
@@ -21,14 +21,14 @@ package org.apache.paimon.flink.sink.cdc;
 import org.apache.paimon.flink.sink.Committable;
 import org.apache.paimon.flink.sink.StoreSinkWrite;
 import org.apache.paimon.flink.sink.UnawareBucketSink;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 
 import org.apache.flink.streaming.api.operators.OneInputStreamOperator;
 
 /** CDC Sink for unaware bucket table. */
 public class CdcUnawareBucketSink extends UnawareBucketSink<CdcRecord> {
 
-    public CdcUnawareBucketSink(AppendOnlyFileStoreTable table, Integer 
parallelism) {
+    public CdcUnawareBucketSink(FileStoreTable table, Integer parallelism) {
         super(table, null, null, parallelism, false);
     }
 
diff --git 
a/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSyncDatabaseSinkBuilder.java
 
b/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSyncDatabaseSinkBuilder.java
index c20aaf612..4985f4829 100644
--- 
a/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSyncDatabaseSinkBuilder.java
+++ 
b/paimon-flink/paimon-flink-cdc/src/main/java/org/apache/paimon/flink/sink/cdc/FlinkCdcSyncDatabaseSinkBuilder.java
@@ -27,7 +27,6 @@ import 
org.apache.paimon.flink.utils.SingleOutputStreamOperatorUtils;
 import org.apache.paimon.options.MemorySize;
 import org.apache.paimon.options.Options;
 import org.apache.paimon.schema.SchemaManager;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.BucketMode;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.utils.Preconditions;
@@ -171,7 +170,7 @@ public class FlinkCdcSyncDatabaseSinkBuilder<T> {
     }
 
     private void buildForUnawareBucket(FileStoreTable table, 
DataStream<CdcRecord> parsed) {
-        new CdcUnawareBucketSink((AppendOnlyFileStoreTable) table, 
parallelism).sinkFrom(parsed);
+        new CdcUnawareBucketSink(table, parallelism).sinkFrom(parsed);
     }
 
     private void buildDividedCdcSink() {
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactAction.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactAction.java
index 3f197bb8a..313a7a5d4 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactAction.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactAction.java
@@ -23,7 +23,6 @@ import 
org.apache.paimon.flink.compact.UnawareBucketCompactionTopoBuilder;
 import org.apache.paimon.flink.sink.CompactorSinkBuilder;
 import org.apache.paimon.flink.source.CompactorSourceBuilder;
 import org.apache.paimon.flink.utils.StreamExecutionEnvironmentUtils;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.FileStoreTable;
 
 import org.apache.flink.api.common.RuntimeExecutionMode;
@@ -83,8 +82,7 @@ public class CompactAction extends TableActionBase {
         switch (fileStoreTable.bucketMode()) {
             case UNAWARE:
                 {
-                    buildForUnawareBucketCompaction(
-                            env, (AppendOnlyFileStoreTable) table, 
isStreaming);
+                    buildForUnawareBucketCompaction(env, fileStoreTable, 
isStreaming);
                     break;
                 }
             case FIXED:
@@ -109,7 +107,7 @@ public class CompactAction extends TableActionBase {
     }
 
     private void buildForUnawareBucketCompaction(
-            StreamExecutionEnvironment env, AppendOnlyFileStoreTable table, 
boolean isStreaming) {
+            StreamExecutionEnvironment env, FileStoreTable table, boolean 
isStreaming) {
         UnawareBucketCompactionTopoBuilder unawareBucketCompactionTopoBuilder =
                 new UnawareBucketCompactionTopoBuilder(env, 
identifier.getFullName(), table);
 
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactDatabaseAction.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactDatabaseAction.java
index 9fe095888..cffa94dfc 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactDatabaseAction.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/CompactDatabaseAction.java
@@ -30,7 +30,6 @@ import org.apache.paimon.flink.source.CompactorSourceBuilder;
 import org.apache.paimon.flink.source.MultiTablesCompactorSourceBuilder;
 import org.apache.paimon.flink.utils.StreamExecutionEnvironmentUtils;
 import org.apache.paimon.options.Options;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.Table;
 import org.apache.paimon.utils.Preconditions;
@@ -66,7 +65,7 @@ public class CompactDatabaseAction extends ActionBase {
 
     private MultiTablesSinkMode databaseCompactMode = 
MultiTablesSinkMode.DIVIDED;
 
-    private final Map<String, Table> tableMap = new HashMap<>();
+    private final Map<String, FileStoreTable> tableMap = new HashMap<>();
 
     private Options tableOptions = new Options();
 
@@ -143,11 +142,12 @@ public class CompactDatabaseAction extends ActionBase {
                                                 table.getClass().getName()));
                                 continue;
                             }
-                            table =
-                                    table.copy(
-                                            Collections.singletonMap(
-                                                    
CoreOptions.WRITE_ONLY.key(), "false"));
-                            tableMap.put(fullTableName, table);
+                            FileStoreTable fileStoreTable =
+                                    (FileStoreTable)
+                                            table.copy(
+                                                    Collections.singletonMap(
+                                                            
CoreOptions.WRITE_ONLY.key(), "false"));
+                            tableMap.put(fullTableName, fileStoreTable);
                         } else {
                             LOG.debug("The table {} is excluded.", 
fullTableName);
                         }
@@ -165,16 +165,13 @@ public class CompactDatabaseAction extends ActionBase {
         ReadableConfig conf = 
StreamExecutionEnvironmentUtils.getConfiguration(env);
         boolean isStreaming =
                 conf.get(ExecutionOptions.RUNTIME_MODE) == 
RuntimeExecutionMode.STREAMING;
-        for (Map.Entry<String, Table> entry : tableMap.entrySet()) {
-            FileStoreTable fileStoreTable = (FileStoreTable) entry.getValue();
+        for (Map.Entry<String, FileStoreTable> entry : tableMap.entrySet()) {
+            FileStoreTable fileStoreTable = entry.getValue();
             switch (fileStoreTable.bucketMode()) {
                 case UNAWARE:
                     {
                         buildForUnawareBucketCompaction(
-                                env,
-                                entry.getKey(),
-                                (AppendOnlyFileStoreTable) entry.getValue(),
-                                isStreaming);
+                                env, entry.getKey(), fileStoreTable, 
isStreaming);
                         break;
                     }
                 case FIXED:
@@ -229,7 +226,7 @@ public class CompactDatabaseAction extends ActionBase {
     private void buildForUnawareBucketCompaction(
             StreamExecutionEnvironment env,
             String fullName,
-            AppendOnlyFileStoreTable table,
+            FileStoreTable table,
             boolean isStreaming) {
         UnawareBucketCompactionTopoBuilder unawareBucketCompactionTopoBuilder =
                 new UnawareBucketCompactionTopoBuilder(env, fullName, table);
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactionTopoBuilder.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactionTopoBuilder.java
index 84031474a..7d986463d 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactionTopoBuilder.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/compact/UnawareBucketCompactionTopoBuilder.java
@@ -25,7 +25,7 @@ import 
org.apache.paimon.flink.sink.UnawareBucketCompactionSink;
 import org.apache.paimon.flink.source.BucketUnawareCompactSource;
 import org.apache.paimon.options.Options;
 import org.apache.paimon.predicate.PredicateBuilder;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 
 import org.apache.flink.streaming.api.datastream.DataStream;
 import org.apache.flink.streaming.api.datastream.DataStreamSource;
@@ -51,14 +51,12 @@ public class UnawareBucketCompactionTopoBuilder {
 
     private final transient StreamExecutionEnvironment env;
     private final String tableIdentifier;
-    private final AppendOnlyFileStoreTable table;
+    private final FileStoreTable table;
     @Nullable private List<Map<String, String>> specifiedPartitions = null;
     private boolean isContinuous = false;
 
     public UnawareBucketCompactionTopoBuilder(
-            StreamExecutionEnvironment env,
-            String tableIdentifier,
-            AppendOnlyFileStoreTable table) {
+            StreamExecutionEnvironment env, String tableIdentifier, 
FileStoreTable table) {
         this.env = env;
         this.tableIdentifier = tableIdentifier;
         this.table = table;
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperator.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperator.java
index 4ed939fdc..0860ccb3a 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperator.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperator.java
@@ -23,7 +23,7 @@ import org.apache.paimon.append.AppendOnlyCompactionTask;
 import org.apache.paimon.flink.source.BucketUnawareCompactSource;
 import org.apache.paimon.operation.AppendOnlyFileStoreWrite;
 import org.apache.paimon.options.Options;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.sink.CommitMessage;
 import org.apache.paimon.table.sink.TableCommitImpl;
 import org.apache.paimon.utils.ExecutorThreadFactory;
@@ -53,15 +53,14 @@ public class AppendOnlyTableCompactionWorkerOperator
     private static final Logger LOG =
             
LoggerFactory.getLogger(AppendOnlyTableCompactionWorkerOperator.class);
 
-    private final AppendOnlyFileStoreTable table;
+    private final FileStoreTable table;
     private final String commitUser;
 
     private transient AppendOnlyFileStoreWrite write;
     private transient ExecutorService lazyCompactExecutor;
     private transient Queue<Future<CommitMessage>> result;
 
-    public AppendOnlyTableCompactionWorkerOperator(
-            AppendOnlyFileStoreTable table, String commitUser) {
+    public AppendOnlyTableCompactionWorkerOperator(FileStoreTable table, 
String commitUser) {
         super(Options.fromMap(table.options()));
         this.table = table;
         this.commitUser = commitUser;
@@ -75,7 +74,7 @@ public class AppendOnlyTableCompactionWorkerOperator
     @Override
     public void open() throws Exception {
         LOG.debug("Opened a append-only table compaction worker.");
-        this.write = table.store().newWrite(commitUser);
+        this.write = (AppendOnlyFileStoreWrite) 
table.store().newWrite(commitUser);
         this.result = new LinkedList<>();
     }
 
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
index 17926093c..b5de897b9 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSinkBuilder.java
@@ -20,7 +20,6 @@ package org.apache.paimon.flink.sink;
 
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.flink.sink.index.GlobalDynamicBucketSink;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.BucketMode;
 import org.apache.paimon.table.FileStoreTable;
 
@@ -142,14 +141,10 @@ public class FlinkSinkBuilder {
 
     private DataStreamSink<?> buildUnawareBucketSink(DataStream<InternalRow> 
input) {
         checkArgument(
-                table instanceof AppendOnlyFileStoreTable,
+                table.primaryKeys().isEmpty(),
                 "Unaware bucket mode only works with append-only table for 
now.");
         return new RowUnawareBucketSink(
-                        (AppendOnlyFileStoreTable) table,
-                        overwritePartition,
-                        logSinkFunction,
-                        parallelism,
-                        boundedInput)
+                        table, overwritePartition, logSinkFunction, 
parallelism, boundedInput)
                 .sinkFrom(input);
     }
 }
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkTableSinkBase.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkTableSinkBase.java
index 3874e2ca7..7434ce07f 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkTableSinkBase.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkTableSinkBase.java
@@ -26,9 +26,7 @@ import org.apache.paimon.flink.PaimonDataStreamSinkProvider;
 import org.apache.paimon.flink.log.LogSinkProvider;
 import org.apache.paimon.flink.log.LogStoreTableFactory;
 import org.apache.paimon.options.Options;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.FileStoreTable;
-import org.apache.paimon.table.PrimaryKeyFileStoreTable;
 import org.apache.paimon.table.Table;
 
 import org.apache.flink.streaming.api.datastream.DataStream;
@@ -75,11 +73,11 @@ public abstract class FlinkTableSinkBase
 
     @Override
     public ChangelogMode getChangelogMode(ChangelogMode requestedMode) {
-        if (table instanceof AppendOnlyFileStoreTable) {
+        if (table.primaryKeys().isEmpty()) {
             // Don't check this, for example, only inserts are available from 
the database, but the
             // plan phase contains all changelogs
             return requestedMode;
-        } else if (table instanceof PrimaryKeyFileStoreTable) {
+        } else {
             Options options = Options.fromMap(table.options());
             if (options.get(CHANGELOG_PRODUCER) == ChangelogProducer.INPUT) {
                 return requestedMode;
@@ -101,9 +99,6 @@ public abstract class FlinkTableSinkBase
                 }
             }
             return builder.build();
-        } else {
-            throw new UnsupportedOperationException(
-                    "Unknown FileStoreTable subclass " + 
table.getClass().getName());
         }
     }
 
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/RowUnawareBucketSink.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/RowUnawareBucketSink.java
index d838a9aa4..d7b8c76cf 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/RowUnawareBucketSink.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/RowUnawareBucketSink.java
@@ -19,7 +19,7 @@
 package org.apache.paimon.flink.sink;
 
 import org.apache.paimon.data.InternalRow;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 
 import org.apache.flink.streaming.api.operators.OneInputStreamOperator;
 
@@ -29,7 +29,7 @@ import java.util.Map;
 public class RowUnawareBucketSink extends UnawareBucketSink<InternalRow> {
 
     public RowUnawareBucketSink(
-            AppendOnlyFileStoreTable table,
+            FileStoreTable table,
             Map<String, String> overwritePartitions,
             LogSinkFunction logSinkFunction,
             Integer parallelism,
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/SupportsRowLevelOperationFlinkTableSink.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/SupportsRowLevelOperationFlinkTableSink.java
index 4150b7f3a..c45fd168f 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/SupportsRowLevelOperationFlinkTableSink.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/SupportsRowLevelOperationFlinkTableSink.java
@@ -28,9 +28,7 @@ import org.apache.paimon.predicate.AllPrimaryKeyEqualVisitor;
 import org.apache.paimon.predicate.OnlyPartitionKeyEqualVisitor;
 import org.apache.paimon.predicate.Predicate;
 import org.apache.paimon.predicate.PredicateBuilder;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.FileStoreTable;
-import org.apache.paimon.table.PrimaryKeyFileStoreTable;
 import org.apache.paimon.table.Table;
 import org.apache.paimon.table.TableUtils;
 import org.apache.paimon.table.sink.BatchWriteBuilder;
@@ -93,7 +91,7 @@ public abstract class SupportsRowLevelOperationFlinkTableSink 
extends FlinkTable
         // unsupported. Similarly, it is not allowed to update the primary key 
column when updating
         // the column of PrimaryKeyFileStoreTable, because the old data cannot 
be handled
         // correctly.
-        if (table instanceof PrimaryKeyFileStoreTable) {
+        if (table.primaryKeys().size() > 0) {
             Options options = Options.fromMap(table.options());
             Set<String> primaryKeys = new HashSet<>(table.primaryKeys());
             updatedColumns.forEach(
@@ -126,15 +124,10 @@ public abstract class 
SupportsRowLevelOperationFlinkTableSink extends FlinkTable
                             MERGE_ENGINE.key(),
                             MergeEngine.DEDUPLICATE,
                             MergeEngine.PARTIAL_UPDATE));
-        } else if (table instanceof AppendOnlyFileStoreTable) {
-            throw new UnsupportedOperationException(
-                    String.format(
-                            "%s can not support update, because there is no 
primary key.",
-                            table.getClass().getName()));
         } else {
             throw new UnsupportedOperationException(
                     String.format(
-                            "%s can not support update, because it is an 
unknown subclass of FileStoreTable.",
+                            "%s can not support update, because there is no 
primary key.",
                             table.getClass().getName()));
         }
     }
@@ -184,7 +177,7 @@ public abstract class 
SupportsRowLevelOperationFlinkTableSink extends FlinkTable
     }
 
     private void validateDeletable() {
-        if (table instanceof PrimaryKeyFileStoreTable) {
+        if (table.primaryKeys().size() > 0) {
             Options options = Options.fromMap(table.options());
             if (options.get(MERGE_ENGINE) == MergeEngine.DEDUPLICATE) {
                 return;
@@ -193,15 +186,10 @@ public abstract class 
SupportsRowLevelOperationFlinkTableSink extends FlinkTable
                     String.format(
                             "merge engine '%s' can not support delete, 
currently only %s can support delete.",
                             options.get(MERGE_ENGINE), 
MergeEngine.DEDUPLICATE));
-        } else if (table instanceof AppendOnlyFileStoreTable) {
-            throw new UnsupportedOperationException(
-                    String.format(
-                            "table '%s' can not support delete, because there 
is no primary key.",
-                            table.getClass().getName()));
         } else {
             throw new UnsupportedOperationException(
                     String.format(
-                            "%s can not support delete, because it is an 
unknown subclass of FileStoreTable.",
+                            "table '%s' can not support delete, because there 
is no primary key.",
                             table.getClass().getName()));
         }
     }
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketCompactionSink.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketCompactionSink.java
index 5c027a326..cf825cec7 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketCompactionSink.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketCompactionSink.java
@@ -20,7 +20,7 @@ package org.apache.paimon.flink.sink;
 
 import org.apache.paimon.append.AppendOnlyCompactionTask;
 import org.apache.paimon.manifest.ManifestCommittable;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 
 import org.apache.flink.streaming.api.datastream.DataStream;
 import org.apache.flink.streaming.api.datastream.DataStreamSink;
@@ -29,15 +29,15 @@ import 
org.apache.flink.streaming.api.operators.OneInputStreamOperator;
 /** Compaction Sink for unaware-bucket table. */
 public class UnawareBucketCompactionSink extends 
FlinkSink<AppendOnlyCompactionTask> {
 
-    private final AppendOnlyFileStoreTable table;
+    private final FileStoreTable table;
 
-    public UnawareBucketCompactionSink(AppendOnlyFileStoreTable table) {
+    public UnawareBucketCompactionSink(FileStoreTable table) {
         super(table, true);
         this.table = table;
     }
 
     public static DataStreamSink<?> sink(
-            AppendOnlyFileStoreTable table, 
DataStream<AppendOnlyCompactionTask> input) {
+            FileStoreTable table, DataStream<AppendOnlyCompactionTask> input) {
         return new UnawareBucketCompactionSink(table).sinkFrom(input);
     }
 
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketSink.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketSink.java
index abfb1c845..ed4bca7b2 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketSink.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/UnawareBucketSink.java
@@ -19,7 +19,7 @@
 package org.apache.paimon.flink.sink;
 
 import org.apache.paimon.flink.compact.UnawareBucketCompactionTopoBuilder;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 
 import org.apache.flink.api.common.RuntimeExecutionMode;
 import org.apache.flink.configuration.ExecutionOptions;
@@ -37,14 +37,14 @@ import java.util.Map;
  */
 public abstract class UnawareBucketSink<T> extends FlinkWriteSink<T> {
 
-    protected final AppendOnlyFileStoreTable table;
+    protected final FileStoreTable table;
     protected final LogSinkFunction logSinkFunction;
 
     @Nullable protected final Integer parallelism;
     protected final boolean boundedInput;
 
     public UnawareBucketSink(
-            AppendOnlyFileStoreTable table,
+            FileStoreTable table,
             @Nullable Map<String, String> overwritePartitions,
             LogSinkFunction logSinkFunction,
             @Nullable Integer parallelism,
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/BucketUnawareCompactSource.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/BucketUnawareCompactSource.java
index 83cf3600a..e6c301ded 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/BucketUnawareCompactSource.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/BucketUnawareCompactSource.java
@@ -22,7 +22,7 @@ import org.apache.paimon.append.AppendOnlyCompactionTask;
 import org.apache.paimon.append.AppendOnlyTableCompactionCoordinator;
 import org.apache.paimon.flink.sink.CompactionTaskTypeInfo;
 import org.apache.paimon.predicate.Predicate;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.source.EndOfScanException;
 
 import org.apache.flink.api.connector.source.Boundedness;
@@ -52,7 +52,7 @@ public class BucketUnawareCompactSource extends 
RichSourceFunction<AppendOnlyCom
     private static final Logger LOG = 
LoggerFactory.getLogger(BucketUnawareCompactSource.class);
     private static final String COMPACTION_COORDINATOR_NAME = "Compaction 
Coordinator";
 
-    private final AppendOnlyFileStoreTable table;
+    private final FileStoreTable table;
     private final boolean streaming;
     private final long scanInterval;
     private final Predicate filter;
@@ -61,7 +61,7 @@ public class BucketUnawareCompactSource extends 
RichSourceFunction<AppendOnlyCom
     private volatile boolean isRunning = true;
 
     public BucketUnawareCompactSource(
-            AppendOnlyFileStoreTable table,
+            FileStoreTable table,
             boolean isStreaming,
             long scanInterval,
             @Nullable Predicate filter) {
diff --git 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
index 208691477..dd3783deb 100644
--- 
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
+++ 
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/source/DataTableSource.java
@@ -31,8 +31,6 @@ import org.apache.paimon.flink.lookup.FileStoreLookupFunction;
 import org.apache.paimon.flink.lookup.LookupRuntimeProviderFactory;
 import org.apache.paimon.options.Options;
 import org.apache.paimon.predicate.Predicate;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
-import org.apache.paimon.table.PrimaryKeyFileStoreTable;
 import org.apache.paimon.table.Table;
 import org.apache.paimon.table.source.Split;
 import org.apache.paimon.utils.Projection;
@@ -145,9 +143,9 @@ public class DataTableSource extends FlinkTableSource {
             return ChangelogMode.insertOnly();
         }
 
-        if (table instanceof AppendOnlyFileStoreTable) {
+        if (table.primaryKeys().isEmpty()) {
             return ChangelogMode.insertOnly();
-        } else if (table instanceof PrimaryKeyFileStoreTable) {
+        } else {
             Options options = Options.fromMap(table.options());
 
             if (new CoreOptions(options).mergeEngine() == 
CoreOptions.MergeEngine.FIRST_ROW) {
@@ -169,11 +167,6 @@ public class DataTableSource extends FlinkTableSource {
                             && options.get(LOG_CHANGELOG_MODE) == 
LogChangelogMode.ALL
                     ? ChangelogMode.all()
                     : ChangelogMode.upsert();
-        } else {
-            throw new UnsupportedOperationException(
-                    "Unsupported Table subclass "
-                            + table.getClass().getName()
-                            + " for streaming mode.");
         }
     }
 
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForDynamicBucketITCase.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForDynamicBucketITCase.java
index adc19eb4f..ff3616e65 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForDynamicBucketITCase.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForDynamicBucketITCase.java
@@ -24,11 +24,11 @@ import org.apache.paimon.data.BinaryString;
 import org.apache.paimon.data.GenericRow;
 import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.manifest.ManifestEntry;
+import org.apache.paimon.operation.KeyValueFileStoreScan;
 import org.apache.paimon.predicate.Predicate;
 import org.apache.paimon.predicate.PredicateBuilder;
 import org.apache.paimon.schema.Schema;
 import org.apache.paimon.table.FileStoreTable;
-import org.apache.paimon.table.PrimaryKeyFileStoreTable;
 import org.apache.paimon.table.Table;
 import org.apache.paimon.table.sink.BatchTableCommit;
 import org.apache.paimon.table.sink.BatchTableWrite;
@@ -41,6 +41,7 @@ import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Random;
 
@@ -57,23 +58,18 @@ public class SortCompactActionForDynamicBucketITCase 
extends ActionITCaseBase {
         PredicateBuilder predicateBuilder = new 
PredicateBuilder(getTable().rowType());
         Predicate predicate = predicateBuilder.between(1, 100L, 200L);
 
-        List<ManifestEntry> files = ((FileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> files = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilter =
-                ((PrimaryKeyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((KeyValueFileStoreScan) getTable().store().newScan())
                         .withValueFilter(predicate)
                         .plan()
                         .files();
 
         zorder(Arrays.asList("f2", "f1"));
 
-        List<ManifestEntry> filesZorder =
-                ((FileStoreTable) getTable()).store().newScan().plan().files();
+        List<ManifestEntry> filesZorder = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilterZorder =
-                ((PrimaryKeyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((KeyValueFileStoreScan) getTable().store().newScan())
                         .withValueFilter(predicate)
                         .plan()
                         .files();
@@ -91,23 +87,18 @@ public class SortCompactActionForDynamicBucketITCase 
extends ActionITCaseBase {
 
         // order f2,f1 will make predicate of f1 perform worse.
         order(Arrays.asList("f2", "f1"));
-        List<ManifestEntry> files = ((FileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> files = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilter =
-                ((PrimaryKeyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((KeyValueFileStoreScan) getTable().store().newScan())
                         .withValueFilter(predicate)
                         .plan()
                         .files();
 
         zorder(Arrays.asList("f2", "f1"));
 
-        List<ManifestEntry> filesZorder =
-                ((FileStoreTable) getTable()).store().newScan().plan().files();
+        List<ManifestEntry> filesZorder = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilterZorder =
-                ((PrimaryKeyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((KeyValueFileStoreScan) getTable().store().newScan())
                         .withValueFilter(predicate)
                         .plan()
                         .files();
@@ -128,23 +119,18 @@ public class SortCompactActionForDynamicBucketITCase 
extends ActionITCaseBase {
                         BinaryString.fromString("000000000" + 100),
                         BinaryString.fromString("000000000" + 200));
 
-        List<ManifestEntry> files = ((FileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> files = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilter =
-                ((PrimaryKeyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((KeyValueFileStoreScan) getTable().store().newScan())
                         .withValueFilter(predicate)
                         .plan()
                         .files();
 
-        zorder(Arrays.asList("f4"));
+        zorder(Collections.singletonList("f4"));
 
-        List<ManifestEntry> filesZorder =
-                ((FileStoreTable) getTable()).store().newScan().plan().files();
+        List<ManifestEntry> filesZorder = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilterZorder =
-                ((PrimaryKeyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((KeyValueFileStoreScan) getTable().store().newScan())
                         .withValueFilter(predicate)
                         .plan()
                         .files();
@@ -238,8 +224,8 @@ public class SortCompactActionForDynamicBucketITCase 
extends ActionITCaseBase {
         catalog.createTable(identifier(), schema(), true);
     }
 
-    private Table getTable() throws Exception {
-        return catalog.getTable(identifier());
+    private FileStoreTable getTable() throws Exception {
+        return (FileStoreTable) catalog.getTable(identifier());
     }
 
     private Identifier identifier() {
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForUnawareBucketITCase.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForUnawareBucketITCase.java
index dc9c56879..cadd70e89 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForUnawareBucketITCase.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/action/SortCompactActionForUnawareBucketITCase.java
@@ -26,10 +26,11 @@ import org.apache.paimon.data.InternalRow;
 import org.apache.paimon.data.Timestamp;
 import org.apache.paimon.flink.FlinkConnectorOptions;
 import org.apache.paimon.manifest.ManifestEntry;
+import org.apache.paimon.operation.AppendOnlyFileStoreScan;
 import org.apache.paimon.predicate.Predicate;
 import org.apache.paimon.predicate.PredicateBuilder;
 import org.apache.paimon.schema.Schema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
+import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.Table;
 import org.apache.paimon.table.sink.BatchTableCommit;
 import org.apache.paimon.table.sink.BatchTableWrite;
@@ -92,8 +93,7 @@ public class SortCompactActionForUnawareBucketITCase extends 
ActionITCaseBase {
         Assertions.assertThatCode(() -> order(Arrays.asList("f1", "f2")))
                 .doesNotThrowAnyException();
 
-        List<ManifestEntry> files =
-                ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> files = 
getTable().store().newScan().plan().files();
 
         ManifestEntry entry = files.get(0);
         DataSplit dataSplit =
@@ -118,7 +118,7 @@ public class SortCompactActionForUnawareBucketITCase 
extends ActionITCaseBase {
         Assertions.assertThatCode(() -> order(Arrays.asList("f2", "f1")))
                 .doesNotThrowAnyException();
 
-        files = ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        files = getTable().store().newScan().plan().files();
 
         entry = files.get(0);
         dataSplit =
@@ -161,12 +161,9 @@ public class SortCompactActionForUnawareBucketITCase 
extends ActionITCaseBase {
         PredicateBuilder predicateBuilder = new 
PredicateBuilder(getTable().rowType());
         Predicate predicate = predicateBuilder.between(1, 100, 200);
 
-        List<ManifestEntry> files =
-                ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> files = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilter =
-                ((AppendOnlyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((AppendOnlyFileStoreScan) getTable().store().newScan())
                         .withFilter(predicate)
                         .plan()
                         .files();
@@ -175,11 +172,9 @@ public class SortCompactActionForUnawareBucketITCase 
extends ActionITCaseBase {
 
         zorder(Arrays.asList("f2", "f1"));
 
-        files = ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        files = getTable().store().newScan().plan().files();
         filesFilter =
-                ((AppendOnlyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((AppendOnlyFileStoreScan) getTable().store().newScan())
                         .withFilter(predicate)
                         .plan()
                         .files();
@@ -194,23 +189,17 @@ public class SortCompactActionForUnawareBucketITCase 
extends ActionITCaseBase {
         PredicateBuilder predicateBuilder = new 
PredicateBuilder(getTable().rowType());
         Predicate predicate = predicateBuilder.between(1, 10, 20);
 
-        List<ManifestEntry> filesZorder =
-                ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> filesZorder = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilterZorder =
-                ((AppendOnlyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((AppendOnlyFileStoreScan) getTable().store().newScan())
                         .withFilter(predicate)
                         .plan()
                         .files();
 
         order(Arrays.asList("f2", "f1"));
-        List<ManifestEntry> filesOrder =
-                ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> filesOrder = 
getTable().store().newScan().plan().files();
         List<ManifestEntry> filesFilterOrder =
-                ((AppendOnlyFileStoreTable) getTable())
-                        .store()
-                        .newScan()
+                ((AppendOnlyFileStoreScan) getTable().store().newScan())
                         .withFilter(predicate)
                         .plan()
                         .files();
@@ -246,15 +235,14 @@ public class SortCompactActionForUnawareBucketITCase 
extends ActionITCaseBase {
         prepareSameData(200);
         Assertions.assertThatCode(() -> order(Collections.singletonList("f1")))
                 .doesNotThrowAnyException();
-        List<ManifestEntry> files =
-                ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        List<ManifestEntry> files = 
getTable().store().newScan().plan().files();
         Assertions.assertThat(files.size()).isEqualTo(3);
 
         dropTable();
         prepareSameData(200);
         Assertions.assertThatCode(() -> zorder(Arrays.asList("f1", "f2")))
                 .doesNotThrowAnyException();
-        files = ((AppendOnlyFileStoreTable) 
getTable()).store().newScan().plan().files();
+        files = getTable().store().newScan().plan().files();
         Assertions.assertThat(files.size()).isEqualTo(3);
     }
 
@@ -370,8 +358,8 @@ public class SortCompactActionForUnawareBucketITCase 
extends ActionITCaseBase {
         return messages;
     }
 
-    private Table getTable() throws Exception {
-        return catalog.getTable(identifier());
+    private FileStoreTable getTable() throws Exception {
+        return (FileStoreTable) catalog.getTable(identifier());
     }
 
     private static List<CommitMessage> writeOnce(Table table, int p, int size) 
throws Exception {
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperatorTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperatorTest.java
index 26c8b8427..ad4a2a313 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperatorTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/sink/AppendOnlyTableCompactionWorkerOperatorTest.java
@@ -27,7 +27,6 @@ import org.apache.paimon.fs.local.LocalFileIO;
 import org.apache.paimon.io.DataFileMeta;
 import org.apache.paimon.io.DataFilePathFactory;
 import org.apache.paimon.schema.Schema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.TableTestBase;
 import org.apache.paimon.table.sink.CommitMessage;
 import org.apache.paimon.table.sink.CommitMessageImpl;
@@ -50,8 +49,7 @@ public class AppendOnlyTableCompactionWorkerOperatorTest 
extends TableTestBase {
     public void testAsyncCompactionWorks() throws Exception {
         createTableDefault();
         AppendOnlyTableCompactionWorkerOperator workerOperator =
-                new AppendOnlyTableCompactionWorkerOperator(
-                        (AppendOnlyFileStoreTable) getTableDefault(), "user");
+                new AppendOnlyTableCompactionWorkerOperator(getTableDefault(), 
"user");
 
         // write 200 files
         List<CommitMessage> commitMessages = writeDataDefault(200, 20);
@@ -103,8 +101,7 @@ public class AppendOnlyTableCompactionWorkerOperatorTest 
extends TableTestBase {
     public void testAsyncCompactionFileDeletedWhenShutdown() throws Exception {
         createTableDefault();
         AppendOnlyTableCompactionWorkerOperator workerOperator =
-                new AppendOnlyTableCompactionWorkerOperator(
-                        (AppendOnlyFileStoreTable) getTableDefault(), "user");
+                new AppendOnlyTableCompactionWorkerOperator(getTableDefault(), 
"user");
 
         // write 200 files
         List<CommitMessage> commitMessages = writeDataDefault(200, 40);
@@ -125,7 +122,7 @@ public class AppendOnlyTableCompactionWorkerOperatorTest 
extends TableTestBase {
 
         LocalFileIO localFileIO = LocalFileIO.create();
         DataFilePathFactory dataFilePathFactory =
-                ((AppendOnlyFileStoreTable) getTableDefault())
+                getTableDefault()
                         .store()
                         .pathFactory()
                         .createDataFilePathFactory(BinaryRow.EMPTY_ROW, 0);
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/AppendOnlyTableStatisticsTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/AppendOnlyTableStatisticsTest.java
index 6e32b61c2..6b6ae8c3a 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/AppendOnlyTableStatisticsTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/AppendOnlyTableStatisticsTest.java
@@ -23,11 +23,10 @@ import org.apache.paimon.fs.local.LocalFileIO;
 import org.apache.paimon.options.Options;
 import org.apache.paimon.schema.SchemaManager;
 import org.apache.paimon.schema.TableSchema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.FileStoreTableFactory;
 
-/** Statistics tests for {@link AppendOnlyFileStoreTable}. */
+/** Statistics tests for append only tables. */
 public class AppendOnlyTableStatisticsTest extends 
FileStoreTableStatisticsTestBase {
     @Override
     protected FileStoreTable createStoreTable() throws Exception {
diff --git 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/PrimaryKeyTableStatisticsTest.java
 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/PrimaryKeyTableStatisticsTest.java
index 745a4edc2..91a607aaf 100644
--- 
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/PrimaryKeyTableStatisticsTest.java
+++ 
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/statistics/PrimaryKeyTableStatisticsTest.java
@@ -27,15 +27,14 @@ import org.apache.paimon.schema.SchemaManager;
 import org.apache.paimon.schema.TableSchema;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.FileStoreTableFactory;
-import org.apache.paimon.table.PrimaryKeyFileStoreTable;
 
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-/** Statistics tests for {@link PrimaryKeyFileStoreTable}. */
+/** Statistics tests for table with primary keys. */
 public class PrimaryKeyTableStatisticsTest extends 
FileStoreTableStatisticsTestBase {
 
-    /** {@link PrimaryKeyFileStoreTable} does not support filter value. */
+    /** Primary key tables does not support filter value. */
     @Test
     public void testTableFilterValueStatistics() throws Exception {
         FileStoreTable table = writeData();
diff --git 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/migrate/HiveMigrator.java
 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/migrate/HiveMigrator.java
index c199d7e89..642236cfc 100644
--- 
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/migrate/HiveMigrator.java
+++ 
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/migrate/HiveMigrator.java
@@ -30,7 +30,6 @@ import org.apache.paimon.io.DataFileMeta;
 import org.apache.paimon.migrate.FileMetaUtils;
 import org.apache.paimon.migrate.Migrator;
 import org.apache.paimon.schema.Schema;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.BucketMode;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.sink.BatchTableCommit;
@@ -187,7 +186,7 @@ public class HiveMigrator implements Migrator {
     }
 
     private void checkPaimonTable(FileStoreTable paimonTable) {
-        if (!(paimonTable instanceof AppendOnlyFileStoreTable)) {
+        if (paimonTable.primaryKeys().size() > 0) {
             throw new IllegalArgumentException(
                     "Hive migrator only support append only table target 
table");
         }
diff --git 
a/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/procedure/CompactProcedure.java
 
b/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/procedure/CompactProcedure.java
index 13c086e24..4d5cc934d 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/procedure/CompactProcedure.java
+++ 
b/paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/procedure/CompactProcedure.java
@@ -32,7 +32,6 @@ import org.apache.paimon.spark.DynamicOverWrite$;
 import org.apache.paimon.spark.SparkUtils;
 import org.apache.paimon.spark.commands.WriteIntoPaimonTable;
 import org.apache.paimon.spark.sort.TableSorter;
-import org.apache.paimon.table.AppendOnlyFileStoreTable;
 import org.apache.paimon.table.BucketMode;
 import org.apache.paimon.table.FileStoreTable;
 import org.apache.paimon.table.sink.BatchTableCommit;
@@ -246,9 +245,8 @@ public class CompactProcedure extends BaseProcedure {
 
     private void compactUnAwareBucketTable(
             FileStoreTable table, @Nullable Predicate filter, JavaSparkContext 
javaSparkContext) {
-        AppendOnlyFileStoreTable fileStoreTable = (AppendOnlyFileStoreTable) 
table;
         List<AppendOnlyCompactionTask> compactionTasks =
-                new AppendOnlyTableCompactionCoordinator(fileStoreTable, 
false, filter).run();
+                new AppendOnlyTableCompactionCoordinator(table, false, 
filter).run();
         if (compactionTasks.isEmpty()) {
             return;
         }
@@ -271,7 +269,8 @@ public class CompactProcedure extends BaseProcedure {
                                 (FlatMapFunction<Iterator<byte[]>, 
CommitMessage>)
                                         taskIterator -> {
                                             AppendOnlyFileStoreWrite write =
-                                                    
fileStoreTable.store().newWrite(commitUser);
+                                                    (AppendOnlyFileStoreWrite)
+                                                            
table.store().newWrite(commitUser);
                                             CompactionTaskSerializer ser =
                                                     new 
CompactionTaskSerializer();
                                             ArrayList<CommitMessage> messages 
= new ArrayList<>();
diff --git 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScanBuilder.scala
 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScanBuilder.scala
index 64f22d91f..754f2de8b 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScanBuilder.scala
+++ 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonScanBuilder.scala
@@ -17,8 +17,7 @@
  */
 package org.apache.paimon.spark
 
-import org.apache.paimon.table.{AppendOnlyFileStoreTable, Table}
-import org.apache.paimon.table.source.ReadBuilder
+import org.apache.paimon.table.Table
 
 import org.apache.spark.sql.connector.read.SupportsPushDownLimit
 
@@ -27,7 +26,7 @@ class PaimonScanBuilder(table: Table)
   with SupportsPushDownLimit {
 
   override def pushLimit(limit: Int): Boolean = {
-    if (table.isInstanceOf[AppendOnlyFileStoreTable]) {
+    if (table.primaryKeys().isEmpty) {
       pushDownLimit = Some(limit)
     }
     // just make a best effort to push down limit
diff --git 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/catalyst/analysis/RowLevelHelper.scala
 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/catalyst/analysis/RowLevelHelper.scala
index 522d67ccc..63112ecd1 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/catalyst/analysis/RowLevelHelper.scala
+++ 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/catalyst/analysis/RowLevelHelper.scala
@@ -20,26 +20,21 @@ package org.apache.paimon.spark.catalyst.analysis
 import org.apache.paimon.CoreOptions.MERGE_ENGINE
 import org.apache.paimon.options.Options
 import org.apache.paimon.spark.SparkTable
-import org.apache.paimon.table.{FileStoreTable, PrimaryKeyFileStoreTable, 
Table}
 
 import org.apache.spark.sql.catalyst.SQLConfHelper
 import org.apache.spark.sql.catalyst.expressions.{Attribute, 
AttributeReference, AttributeSet, BinaryExpression, EqualTo, Expression, 
SubqueryExpression}
 import org.apache.spark.sql.catalyst.plans.logical.Assignment
 
-import scala.collection.JavaConverters._
-
 trait RowLevelHelper extends SQLConfHelper {
 
   val operation: RowLevelOp
 
   protected def checkPaimonTable(table: SparkTable): Unit = {
-    val paimonTable = table.getTable match {
-      case pkTable: PrimaryKeyFileStoreTable => pkTable
-      case _: FileStoreTable =>
-        throw new UnsupportedOperationException(
-          s"Only support to $operation table with primary keys.")
-      case _ =>
-        throw new UnsupportedOperationException(s"Can't $operation a non-file 
store table.")
+    val paimonTable = if (table.getTable.primaryKeys().size() > 0) {
+      table.getTable
+    } else {
+      throw new UnsupportedOperationException(
+        s"Only support to $operation table with primary keys.")
     }
 
     val options = Options.fromMap(paimonTable.options)

Reply via email to