This is an automated email from the ASF dual-hosted git repository.

czy006 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/amoro.git


The following commit(s) were added to refs/heads/master by this push:
     new 93cde3941 [AMORO-4131] Add non-partitioned table tests for 
RewriteFiles and OverwriteFiles (#4137)
93cde3941 is described below

commit 93cde394135fe94f350d588364028f2af6764fdc
Author: Takch02 <[email protected]>
AuthorDate: Sun Apr 19 17:11:57 2026 +0900

    [AMORO-4131] Add non-partitioned table tests for RewriteFiles and 
OverwriteFiles (#4137)
    
    * Test : Add NonPartition Test case of RewriteFile
    
    Test : Add NonPartition Test case of RewriteFile
    
    * Test : Add NonPartition Test case of OverwriteFile
    
    * style: fix spotless formatting for hive tests
    
    * fix: enforce Hive location consistency for non-partitioned tables on 
rewrite and overwrite
    
    ---------
    
    Co-authored-by: ConradJam <[email protected]>
---
 .../org/apache/amoro/hive/op/UpdateHiveFiles.java  |  42 +++++++-
 .../apache/amoro/hive/op/TestOverwriteFiles.java   | 120 ++++++++++++++++++++-
 .../org/apache/amoro/hive/op/TestRewriteFiles.java |  99 ++++++++++++++++-
 3 files changed, 252 insertions(+), 9 deletions(-)

diff --git 
a/amoro-format-mixed/amoro-mixed-hive/src/main/java/org/apache/amoro/hive/op/UpdateHiveFiles.java
 
b/amoro-format-mixed/amoro-mixed-hive/src/main/java/org/apache/amoro/hive/op/UpdateHiveFiles.java
index 9e6e438a7..2a8cc52c1 100644
--- 
a/amoro-format-mixed/amoro-mixed-hive/src/main/java/org/apache/amoro/hive/op/UpdateHiveFiles.java
+++ 
b/amoro-format-mixed/amoro-mixed-hive/src/main/java/org/apache/amoro/hive/op/UpdateHiveFiles.java
@@ -510,7 +510,47 @@ public abstract class UpdateHiveFiles<T extends 
SnapshotUpdate<T>> implements Sn
     if (this.addFiles.isEmpty()) {
       unpartitionTableLocation = createUnpartitionEmptyLocationForHive();
     } else {
-      unpartitionTableLocation = 
TableFileUtil.getFileDir(this.addFiles.get(0).path().toString());
+      String firstFileDir = 
TableFileUtil.getFileDir(this.addFiles.get(0).path().toString());
+      for (DataFile dataFile : this.addFiles) {
+        String fileDir = TableFileUtil.getFileDir(dataFile.path().toString());
+        if (!new Path(firstFileDir).equals(new Path(fileDir))) {
+          throw new CannotAlterHiveLocationException(
+              "can't update hive location for non-partitioned table, "
+                  + "files are not under the same directory. "
+                  + "expected: "
+                  + firstFileDir
+                  + ", actual: "
+                  + fileDir);
+        }
+      }
+      checkNonPartitionedHiveLocationChange(firstFileDir);
+      unpartitionTableLocation = firstFileDir;
+    }
+  }
+
+  private void checkNonPartitionedHiveLocationChange(String newLocation) {
+    String currentHiveLocation = hiveTable.getSd().getLocation();
+    if (!validateLocation
+        || currentHiveLocation == null
+        || isPathEquals(newLocation, currentHiveLocation)) {
+      return;
+    }
+    Set<String> deleteFilePaths =
+        deleteFiles.stream().map(f -> 
f.path().toString()).collect(Collectors.toSet());
+    try (CloseableIterable<FileScanTask> tasks = table.newScan().planFiles()) {
+      for (FileScanTask task : tasks) {
+        String filePath = task.file().path().toString();
+        if (filePath.startsWith(currentHiveLocation) && 
!deleteFilePaths.contains(filePath)) {
+          throw new CannotAlterHiveLocationException(
+              "can't update hive location for non-partitioned table, "
+                  + "not all files in current hive location are deleted. "
+                  + "file: "
+                  + filePath
+                  + " is not in the delete set");
+        }
+      }
+    } catch (IOException e) {
+      throw new RuntimeException(e);
     }
   }
 
diff --git 
a/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestOverwriteFiles.java
 
b/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestOverwriteFiles.java
index f9abcf7c2..26f192e0e 100644
--- 
a/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestOverwriteFiles.java
+++ 
b/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestOverwriteFiles.java
@@ -288,7 +288,6 @@ public class TestOverwriteFiles extends 
MixedHiveTableTestBase {
 
   @Test
   public void testOverwritePartFiles() throws TException {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     getMixedTable()
         .updateProperties()
@@ -321,9 +320,43 @@ public class TestOverwriteFiles extends 
MixedHiveTableTestBase {
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
   }
 
+  @Test
+  public void testOverwritePartFilesNonPartitioned() throws TException {
+    Assume.assumeFalse(isPartitionedTable());
+    getMixedTable()
+        .updateProperties()
+        .set(TableProperties.WRITE_TARGET_FILE_SIZE_BYTES, "1")
+        .commit();
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-01T12:00:00"));
+    List<DataFile> firstDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    Assert.assertEquals(2, firstDataFiles.size());
+    DataFile deleteFile = firstDataFiles.get(0);
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    OverwriteFiles overwriteFiles = baseStore.newOverwrite();
+    firstDataFiles.forEach(overwriteFiles::addFile);
+    overwriteFiles.commit();
+    firstDataFiles = HiveDataTestHelpers.lastedAddedFiles(baseStore);
+    UpdateHiveFilesTestHelpers.validateHiveTableValues(
+        TEST_HMS.getHiveClient(), getMixedTable(), firstDataFiles);
+
+    // ================== test overwrite part files
+    insertRecords.clear();
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(3, "john", 0, 
"2022-01-01T12:00:00"));
+    List<DataFile> secondDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    overwriteFiles = baseStore.newOverwrite();
+    secondDataFiles.forEach(overwriteFiles::addFile);
+    overwriteFiles.deleteFile(deleteFile);
+
+    Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
+  }
+
   @Test
   public void testOverwriteWithFilesUnderDifferentDir() {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
     OverwriteFiles overwriteFiles = baseStore.newOverwrite();
@@ -343,9 +376,29 @@ public class TestOverwriteFiles extends 
MixedHiveTableTestBase {
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
   }
 
+  @Test
+  public void testOverwriteWithFilesUnderDifferentDirNonPartitioned() {
+    Assume.assumeFalse(isPartitionedTable());
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    OverwriteFiles overwriteFiles = baseStore.newOverwrite();
+
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-02T12:00:00"));
+    List<DataFile> firstDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    firstDataFiles.forEach(overwriteFiles::addFile);
+
+    // write data files under another dir
+    List<DataFile> secondDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    secondDataFiles.forEach(overwriteFiles::addFile);
+
+    Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
+  }
+
   @Test
   public void testOverwriteByAddFilesInDifferentDir() throws TException {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     List<Record> insertRecords = Lists.newArrayList();
     insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
@@ -372,9 +425,36 @@ public class TestOverwriteFiles extends 
MixedHiveTableTestBase {
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
   }
 
+  @Test
+  public void testOverwriteByAddFilesInDifferentDirNonPartitioned() throws 
TException {
+    Assume.assumeFalse(isPartitionedTable());
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-02T12:00:00"));
+    List<DataFile> firstDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    OverwriteFiles overwriteFiles = baseStore.newOverwrite();
+    firstDataFiles.forEach(overwriteFiles::addFile);
+    overwriteFiles.commit();
+    firstDataFiles = HiveDataTestHelpers.lastedAddedFiles(baseStore);
+    UpdateHiveFilesTestHelpers.validateHiveTableValues(
+        TEST_HMS.getHiveClient(), getMixedTable(), firstDataFiles);
+
+    // ================== test add files only in a different dir
+    insertRecords.clear();
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-02T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(3, "john", 0, 
"2022-01-03T12:00:00"));
+    List<DataFile> secondDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    overwriteFiles = baseStore.newOverwrite();
+    secondDataFiles.forEach(overwriteFiles::addFile);
+
+    Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
+  }
+
   @Test
   public void testOverwriteWithSameLocation() throws TException {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     List<Record> insertRecords = Lists.newArrayList();
     insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
@@ -395,4 +475,36 @@ public class TestOverwriteFiles extends 
MixedHiveTableTestBase {
 
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
overwriteFiles::commit);
   }
+
+  @Test
+  public void testOverwriteWithSameLocationNonPartitioned() throws TException {
+    Assume.assumeFalse(isPartitionedTable());
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-02T12:00:00"));
+    List<DataFile> dataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    OverwriteFiles overwriteFiles = baseStore.newOverwrite();
+    dataFiles.forEach(overwriteFiles::addFile);
+    overwriteFiles.commit();
+    dataFiles = HiveDataTestHelpers.lastedAddedFiles(baseStore);
+    UpdateHiveFilesTestHelpers.validateHiveTableValues(
+        TEST_HMS.getHiveClient(), getMixedTable(), dataFiles);
+
+    overwriteFiles = baseStore.newOverwrite();
+    dataFiles.forEach(overwriteFiles::deleteFile);
+    dataFiles.forEach(overwriteFiles::addFile);
+
+    overwriteFiles.commit();
+
+    List<DataFile> afterFiles = 
HiveDataTestHelpers.lastedAddedFiles(baseStore);
+    Assert.assertEquals(dataFiles.size(), afterFiles.size());
+
+    int totalLiveFiles = 
Lists.newArrayList(baseStore.newScan().planFiles()).size();
+    Assert.assertEquals(dataFiles.size(), totalLiveFiles);
+
+    UpdateHiveFilesTestHelpers.validateHiveTableValues(
+        TEST_HMS.getHiveClient(), getMixedTable(), afterFiles);
+  }
 }
diff --git 
a/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestRewriteFiles.java
 
b/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestRewriteFiles.java
index c56c5825d..d9e3b4a07 100644
--- 
a/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestRewriteFiles.java
+++ 
b/amoro-format-mixed/amoro-mixed-hive/src/test/java/org/apache/amoro/hive/op/TestRewriteFiles.java
@@ -225,7 +225,6 @@ public class TestRewriteFiles extends 
MixedHiveTableTestBase {
 
   @Test
   public void testRewritePartFiles() {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     getMixedTable()
         .updateProperties()
@@ -256,9 +255,41 @@ public class TestRewriteFiles extends 
MixedHiveTableTestBase {
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
   }
 
+  @Test
+  public void testRewritePartFilesNonPartitioned() {
+    Assume.assumeFalse(isPartitionedTable());
+    getMixedTable()
+        .updateProperties()
+        .set(TableProperties.WRITE_TARGET_FILE_SIZE_BYTES, "1")
+        .commit();
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-01T12:00:00"));
+    initDataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    OverwriteFiles overwriteFiles = baseStore.newOverwrite();
+    initDataFiles.forEach(overwriteFiles::addFile);
+    overwriteFiles.commit();
+
+    initDataFiles = HiveDataTestHelpers.lastedAddedFiles(baseStore);
+    Assert.assertEquals(2, initDataFiles.size());
+    DataFile deleteFile = initDataFiles.get(0);
+
+    // ================== test rewrite part files
+    insertRecords.clear();
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(3, "john", 0, 
"2022-01-01T12:00:00"));
+    List<DataFile> dataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+
+    RewriteFiles rewriteFiles = baseStore.newRewrite();
+    rewriteFiles.rewriteFiles(Sets.newHashSet(deleteFile), 
Sets.newHashSet(dataFiles));
+    Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
+  }
+
   @Test
   public void testRewriteWithFilesUnderDifferentDir() {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     initDataFiles();
     List<Record> insertRecords = Lists.newArrayList();
@@ -280,9 +311,31 @@ public class TestRewriteFiles extends 
MixedHiveTableTestBase {
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
   }
 
+  @Test
+  public void testRewriteWithFilesUnderDifferentDirNonPartitioned() {
+    Assume.assumeFalse(isPartitionedTable());
+    initDataFiles();
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(1, "john", 0, 
"2022-01-01T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-02T12:00:00"));
+    Set<DataFile> addFiles = Sets.newHashSet();
+    List<DataFile> dataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    addFiles.addAll(dataFiles);
+    // write data files under another dir
+    dataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    addFiles.addAll(dataFiles);
+
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    RewriteFiles rewriteFiles = baseStore.newRewrite();
+    rewriteFiles.rewriteFiles(Sets.newHashSet(initDataFiles), addFiles);
+
+    Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
+  }
+
   @Test
   public void testRewriteByAddFilesInDifferentDir() {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     initDataFiles();
     List<Record> insertRecords = Lists.newArrayList();
@@ -300,9 +353,27 @@ public class TestRewriteFiles extends 
MixedHiveTableTestBase {
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
   }
 
+  @Test
+  public void testRewriteByAddFilesInDifferentDirNonPartitioned() {
+    Assume.assumeFalse(isPartitionedTable());
+    initDataFiles();
+    List<Record> insertRecords = Lists.newArrayList();
+    insertRecords.add(tableTestHelper().generateTestRecord(2, "lily", 0, 
"2022-01-02T12:00:00"));
+    insertRecords.add(tableTestHelper().generateTestRecord(3, "john", 0, 
"2022-01-03T12:00:00"));
+    List<DataFile> dataFiles =
+        
HiveDataTestHelpers.writerOf(getMixedTable()).transactionId(1L).writeHive(insertRecords);
+    Set<DataFile> addFiles = Sets.newHashSet(dataFiles);
+    addFiles.addAll(initDataFiles);
+
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    RewriteFiles rewriteFiles = baseStore.newRewrite();
+    rewriteFiles.rewriteFiles(Sets.newHashSet(initDataFiles), addFiles);
+
+    Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
+  }
+
   @Test
   public void testRewriteWithSameLocation() {
-    // TODO should add cases for tables without partition spec
     Assume.assumeTrue(isPartitionedTable());
     initDataFiles();
     UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
@@ -311,4 +382,24 @@ public class TestRewriteFiles extends 
MixedHiveTableTestBase {
 
     Assert.assertThrows(CannotAlterHiveLocationException.class, 
rewriteFiles::commit);
   }
+
+  @Test
+  public void testRewriteWithSameLocationNonPartitioned() throws TException {
+    Assume.assumeFalse(isPartitionedTable());
+    initDataFiles();
+    UnkeyedTable baseStore = MixedTableUtil.baseStore(getMixedTable());
+    RewriteFiles rewriteFiles = baseStore.newRewrite();
+    rewriteFiles.rewriteFiles(Sets.newHashSet(initDataFiles), 
Sets.newHashSet(initDataFiles));
+
+    rewriteFiles.commit();
+
+    List<DataFile> afterFiles = 
HiveDataTestHelpers.lastedAddedFiles(baseStore);
+    Assert.assertEquals(initDataFiles.size(), afterFiles.size());
+
+    int totalLiveFiles = 
Lists.newArrayList(baseStore.newScan().planFiles()).size();
+    Assert.assertEquals(initDataFiles.size(), totalLiveFiles);
+
+    UpdateHiveFilesTestHelpers.validateHiveTableValues(
+        TEST_HMS.getHiveClient(), getMixedTable(), afterFiles);
+  }
 }

Reply via email to