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

shuwenwei pushed a commit to branch removeIsTableModelMethod
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit d05671245a632f4e1b4a1e19ca2d091cbe65c4d3
Author: shuwenwei <[email protected]>
AuthorDate: Fri Oct 9 11:39:23 2026 +0800

    [Storage] Pass table model explicitly in compaction paths
---
 .../performer/impl/FastCompactionPerformer.java    |  8 ++--
 .../impl/ReadChunkCompactionPerformer.java         |  2 +-
 .../impl/ReadPointCompactionPerformer.java         |  2 +-
 .../execute/utils/CompactionPathUtils.java         | 10 +++--
 .../compaction/execute/utils/CompactionUtils.java  | 15 ++++----
 .../execute/utils/MultiTsFileDeviceIterator.java   | 45 ++++++++++++++--------
 .../fast/FastAlignedSeriesCompactionExecutor.java  |  6 ++-
 .../FastNonAlignedSeriesCompactionExecutor.java    |  2 +-
 .../executor/fast/SeriesCompactionExecutor.java    |  5 ++-
 .../selector/impl/SettleSelectorImpl.java          |  7 +++-
 .../apache/iotdb/db/utils/ModificationUtils.java   | 20 ++++++----
 .../compaction/utils/CompactionUtilsTest.java      | 11 +++---
 12 files changed, 81 insertions(+), 52 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
index 9b57f56499a..4af31968488 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
@@ -183,7 +183,6 @@ public class FastCompactionPerformer
         // actually exist but the judgment return device being existed.
         sortedSourceFiles.addAll(seqFiles);
         sortedSourceFiles.addAll(unseqFiles);
-        boolean isTreeModel = !isAligned || 
device.getTableName().startsWith("root.");
         long ttl = deviceIterator.getTTLForCurrentDevice();
         sortedSourceFiles.removeIf(x -> x.definitelyNotContains(device));
         // checked above
@@ -193,7 +192,9 @@ public class FastCompactionPerformer
         if (ttl != Long.MAX_VALUE) {
           ttlDeletion =
               CompactionUtils.convertTtlToDeletion(
-                  device, deviceIterator.getTimeLowerBoundForCurrentDevice());
+                  device,
+                  deviceIterator.getTimeLowerBoundForCurrentDevice(),
+                  deviceIterator.isTableModel());
         }
         compactionWriter.setTTLDeletion(ttlDeletion);
 
@@ -205,7 +206,8 @@ public class FastCompactionPerformer
         compactionWriter.startChunkGroup(device, isAligned);
 
         if (isAligned) {
-          compactAlignedSeries(device, deviceIterator, compactionWriter, 
isTreeModel);
+          compactAlignedSeries(
+              device, deviceIterator, compactionWriter, 
!deviceIterator.isTableModel());
         } else {
           compactNonAlignedSeries(device, deviceIterator, compactionWriter);
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
index da2e15db500..82bdbd3e649 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadChunkCompactionPerformer.java
@@ -256,7 +256,7 @@ public class ReadChunkCompactionPerformer implements 
ISeqCompactionPerformer {
             readerAndChunkMetadataList,
             writer,
             summary,
-            device.getTableName().startsWith("root."));
+            !deviceIterator.isTableModel());
     compactionExecutor.execute();
     for (ChunkMetadata chunkMetadata : 
writer.getChunkMetadataListOfCurrentDeviceInMemory()) {
       if (chunkMetadata.getMeasurementUid().isEmpty()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
index 8ba6cebb82d..517f88cda77 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/ReadPointCompactionPerformer.java
@@ -223,7 +223,7 @@ public class ReadPointCompactionPerformer
             .map(IMeasurementSchema::getMeasurementName)
             .collect(Collectors.toList());
 
-    
fragmentInstanceContext.setIgnoreAllNullRows(device.getTableName().startsWith("root."));
+    
fragmentInstanceContext.setIgnoreAllNullRows(!deviceIterator.isTableModel());
     IDataBlockReader dataBlockReader =
         constructReader(
             device,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java
index 898ea1729f0..fcde517479a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionPathUtils.java
@@ -31,13 +31,15 @@ public class CompactionPathUtils {
 
   private CompactionPathUtils() {}
 
-  public static MeasurementPath getPath(final IDeviceID device, final String 
measurement)
+  public static MeasurementPath getPath(
+      final IDeviceID device, final String measurement, final boolean 
isTableModel)
       throws IllegalPathException {
-    return getPath(device).concatAsMeasurementPath(measurement);
+    return getPath(device, isTableModel).concatAsMeasurementPath(measurement);
   }
 
-  public static PartialPath getPath(final IDeviceID device) throws 
IllegalPathException {
-    if (device.isTableModel()) {
+  public static PartialPath getPath(final IDeviceID device, final boolean 
isTableModel)
+      throws IllegalPathException {
+    if (isTableModel) {
       final String[] nodes = new String[device.segmentNum()];
       nodes[0] = device.getTableName();
       for (int i = 0; i < device.segmentNum() - 1; i++) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
index d26ecdb2129..55143751f18 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
@@ -428,12 +428,13 @@ public class CompactionUtils {
       PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> 
patternTreeMap,
       IDeviceID deviceID,
       String measurement,
-      ModEntry ttlDeletion)
+      ModEntry ttlDeletion,
+      boolean isTableModel)
       throws IllegalPathException {
     if ((patternTreeMap == null) || patternTreeMap.isEmpty()) {
       return ttlDeletion == null ? Collections.emptyList() : 
Collections.singletonList(ttlDeletion);
     }
-    PartialPath path = CompactionPathUtils.getPath(deviceID, measurement);
+    PartialPath path = CompactionPathUtils.getPath(deviceID, measurement, 
isTableModel);
     List<ModEntry> modEntries = patternTreeMap.getOverlapped(path);
     if (ttlDeletion != null) {
       if (!(modEntries instanceof ArrayList)) {
@@ -443,7 +444,7 @@ public class CompactionUtils {
       }
       modEntries.add(ttlDeletion);
     }
-    if (path.getIDeviceID().isTableModel()) {
+    if (isTableModel) {
       modEntries =
           modEntries.stream()
               .filter(e -> e.affects(path.getIDeviceID()) && 
e.affects(path.getMeasurement()))
@@ -500,9 +501,9 @@ public class CompactionUtils {
     return resource.buildDeviceTimeIndex();
   }
 
-  public static ModEntry convertTtlToDeletion(IDeviceID deviceID, long 
timeLowerBound)
-      throws IllegalPathException {
-    if (!deviceID.isTableModel()) {
+  public static ModEntry convertTtlToDeletion(
+      IDeviceID deviceID, long timeLowerBound, boolean isTableModel) throws 
IllegalPathException {
+    if (!isTableModel) {
       return new TreeDeletionEntry(
           new MeasurementPath(deviceID, IoTDBConstant.ONE_LEVEL_PATH_WILDCARD),
           Long.MIN_VALUE,
@@ -524,7 +525,7 @@ public class CompactionUtils {
     PartialPath devicePath;
     PathPatternTree patternTree = new PathPatternTree();
     try {
-      devicePath = CompactionPathUtils.getPath(deviceID);
+      devicePath = CompactionPathUtils.getPath(deviceID, false);
       for (String measurement : measurements) {
         patternTree.appendFullPath(devicePath, measurement);
       }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java
index b9c1224067b..1b5e64f5717 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/MultiTsFileDeviceIterator.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PatternTreeMap;
 import org.apache.iotdb.commons.schema.table.TsTable;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
+import org.apache.iotdb.commons.utils.PathUtils;
 import 
org.apache.iotdb.db.queryengine.plan.analyze.cache.schema.DataNodeTTLCache;
 import org.apache.iotdb.db.schemaengine.lease.MetadataLeaseManager;
 import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
@@ -82,10 +83,10 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
   private final Map<TsFileResource, PatternTreeMap<ModEntry, 
PatternTreeMapFactory.ModsSerializer>>
       modificationCache = new HashMap<>();
   private Pair<IDeviceID, Boolean> currentDevice = null;
-  private boolean ignoreAllNullRows;
   private long ttlForCurrentDevice;
   private long timeLowerBoundForCurrentDevice;
   private final String databaseName;
+  private final boolean isTableModel;
 
   /**
    * Used for compaction with read chunk performer.
@@ -94,6 +95,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
    */
   public MultiTsFileDeviceIterator(List<TsFileResource> tsFileResources) 
throws IOException {
     this.databaseName = tsFileResources.get(0).getDatabaseName();
+    this.isTableModel = PathUtils.isTableModelDatabase(databaseName);
     this.tsFileResourcesSortedByDesc = new ArrayList<>(tsFileResources);
     this.tsFileResourcesSortedByAsc = new ArrayList<>(tsFileResources);
     // sort the files from the oldest to the newest
@@ -131,6 +133,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     this.tsFileResourcesSortedByDesc = new ArrayList<>(seqResources);
     tsFileResourcesSortedByDesc.addAll(unseqResources);
     this.databaseName = tsFileResourcesSortedByDesc.get(0).getDatabaseName();
+    this.isTableModel = PathUtils.isTableModelDatabase(databaseName);
     // sort the files from the newest to the oldest
     Collections.sort(
         this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileCreationOrderByDesc);
@@ -156,6 +159,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     this.tsFileResourcesSortedByDesc = new ArrayList<>(seqResources);
     tsFileResourcesSortedByDesc.addAll(unseqResources);
     this.databaseName = tsFileResourcesSortedByDesc.get(0).getDatabaseName();
+    this.isTableModel = PathUtils.isTableModelDatabase(databaseName);
     // sort tsfiles from the newest to the oldest
     Collections.sort(
         this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileCreationOrderByDesc);
@@ -236,7 +240,6 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
 
     IDeviceID deviceID = currentDevice.left;
     boolean isAligned = currentDevice.right;
-    ignoreAllNullRows = !isAligned || 
deviceID.getTableName().startsWith("root.");
     if (MetadataLeaseManager.getInstance().isFenced()) {
       // Metadata lease fenced: this DataNode may hold a stale TTL (it could 
have missed a
       // ConfigNode
@@ -245,7 +248,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
       // deletes nothing by TTL while fenced, and real TTL deletion resumes 
once the lease recovers
       // and the cache resyncs. (Checked first so the table path also avoids 
the fenced cache.)
       ttlForCurrentDevice = Long.MAX_VALUE;
-    } else if (!ignoreAllNullRows) {
+    } else if (isTableModel) {
       ttlForCurrentDevice =
           DataNodeTTLCache.getInstance().getTTLForTable(databaseName, 
deviceID.getTableName());
     } else {
@@ -262,6 +265,10 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     return databaseName;
   }
 
+  public boolean isTableModel() {
+    return isTableModel;
+  }
+
   public long getTTLForCurrentDevice() {
     return ttlForCurrentDevice;
   }
@@ -271,9 +278,9 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
   }
 
   public Map<String, MeasurementSchema> getAllSchemasOfCurrentDevice() throws 
IOException {
-    return ignoreAllNullRows
-        ? getAllSchemasOfCurrentDeviceForTree()
-        : getAllSchemasOfCurrentDeviceForTable();
+    return isTableModel
+        ? getAllSchemasOfCurrentDeviceForTable()
+        : getAllSchemasOfCurrentDeviceForTree();
   }
 
   /**
@@ -448,9 +455,9 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
    */
   public Map<String, Pair<MeasurementSchema, Map<TsFileResource, Pair<Long, 
Long>>>>
       getTimeseriesSchemaAndMetadataOffsetOfCurrentDevice() throws IOException 
{
-    return ignoreAllNullRows
-        ? getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTree()
-        : getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTable();
+    return isTableModel
+        ? getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTable()
+        : getTimeseriesSchemaAndMetadataOffsetOfCurrentDeviceForTree();
   }
 
   @SuppressWarnings({"checkstyle:AtclauseOrderCheck", "squid:S3824"})
@@ -613,7 +620,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
       TsFileSequenceReader reader = readerMap.get(tsFileResource);
       List<AbstractAlignedChunkMetadata> alignedChunkMetadataList =
           reader.getAlignedChunkMetadataByMetadataIndexNode(
-              currentDevice.left, firstMeasurementNodeOfCurrentDevice, 
ignoreAllNullRows);
+              currentDevice.left, firstMeasurementNodeOfCurrentDevice, 
!isTableModel);
       applyModificationForAlignedChunkMetadataList(tsFileResource, 
alignedChunkMetadataList);
       readerAndChunkMetadataList.add(new Pair<>(reader, 
alignedChunkMetadataList));
     }
@@ -638,7 +645,9 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     ModEntry ttlDeletion = null;
     Optional<Long> startTime = tsFileResource.getStartTime(device);
     if (startTime.isPresent() && startTime.get() < 
timeLowerBoundForCurrentDevice) {
-      ttlDeletion = CompactionUtils.convertTtlToDeletion(device, 
timeLowerBoundForCurrentDevice);
+      ttlDeletion =
+          CompactionUtils.convertTtlToDeletion(
+              device, timeLowerBoundForCurrentDevice, isTableModel);
     }
 
     PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> 
modifications =
@@ -652,7 +661,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     // match time column modifications
     List<ModEntry> modificationForTimeColumn =
         CompactionUtils.getMatchedModifications(
-            modifications, device, AlignedPath.VECTOR_PLACEHOLDER, 
ttlDeletion);
+            modifications, device, AlignedPath.VECTOR_PLACEHOLDER, 
ttlDeletion, isTableModel);
 
     // match value column modifications
     List<List<ModEntry>> modificationForValueColumns = new ArrayList<>();
@@ -663,7 +672,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
       }
       List<ModEntry> modificationList =
           CompactionUtils.getMatchedModifications(
-              modifications, device, valueChunkMetadata.getMeasurementUid(), 
null);
+              modifications, device, valueChunkMetadata.getMeasurementUid(), 
null, isTableModel);
       modificationForValueColumns.add(
           modificationList.isEmpty() ? Collections.emptyList() : 
modificationList);
     }
@@ -672,7 +681,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
         alignedChunkMetadataList,
         modificationForTimeColumn,
         modificationForValueColumns,
-        ignoreAllNullRows);
+        !isTableModel);
   }
 
   public Map<TsFileResource, TsFileSequenceReader> getReaderMap() {
@@ -884,7 +893,11 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
           // collect the modifications for current series
           List<ModEntry> modificationForCurrentSeries =
               CompactionUtils.getMatchedModifications(
-                  modificationsInThisResource, device, 
currentCompactingSeries, ttlDeletion);
+                  modificationsInThisResource,
+                  device,
+                  currentCompactingSeries,
+                  ttlDeletion,
+                  isTableModel);
 
           // if there are modifications of current series, apply them to the 
chunk metadata
           if (!modificationForCurrentSeries.isEmpty()) {
@@ -902,7 +915,7 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
 
   // skip data of deleted table
   private boolean isCurrentDeviceDataInDeprecatedTable(TsFileResource 
resource) {
-    if (ignoreAllNullRows) {
+    if (!isTableModel) {
       return false;
     }
     String tableName = currentDevice.getLeft().getTableName();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
index cf9ed65b819..718373058f6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
@@ -247,7 +247,8 @@ public class FastAlignedSeriesCompactionExecutor extends 
SeriesCompactionExecuto
 
       // get time modifications of this file
       List<ModEntry> timeModifications =
-          getModificationsFromCache(resource, deviceId, 
AlignedPath.VECTOR_PLACEHOLDER);
+          getModificationsFromCache(
+              resource, deviceId, AlignedPath.VECTOR_PLACEHOLDER, 
!ignoreAllNullRows);
       // get value modifications of this file
       List<List<ModEntry>> valueModifications = new ArrayList<>();
       alignedChunkMetadataList
@@ -260,7 +261,8 @@ public class FastAlignedSeriesCompactionExecutor extends 
SeriesCompactionExecuto
                     valueModifications.add(null);
                   } else {
                     valueModifications.add(
-                        getModificationsFromCache(resource, deviceId, 
x.getMeasurementUid()));
+                        getModificationsFromCache(
+                            resource, deviceId, x.getMeasurementUid(), 
!ignoreAllNullRows));
                   }
                 } catch (IllegalPathException e) {
                   throw new RuntimeException(e);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
index 49cbcb14582..b187a568b84 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
@@ -160,7 +160,7 @@ public class FastNonAlignedSeriesCompactionExecutor extends 
SeriesCompactionExec
         ModificationUtils.modifyChunkMetaData(
             iChunkMetadataList,
             getModificationsFromCache(
-                resource, deviceId, 
iChunkMetadataList.get(0).getMeasurementUid()));
+                resource, deviceId, 
iChunkMetadataList.get(0).getMeasurementUid(), false));
         if (iChunkMetadataList.isEmpty()) {
           // all chunks has been deleted in this file, just remove it
           removeFile(fileElement);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java
index b3073bd3d25..1452b27f239 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/SeriesCompactionExecutor.java
@@ -474,7 +474,7 @@ public abstract class SeriesCompactionExecutor {
    * modification from ttl cache.
    */
   protected List<ModEntry> getModificationsFromCache(
-      TsFileResource tsFileResource, IDeviceID deviceId, String measurement)
+      TsFileResource tsFileResource, IDeviceID deviceId, String measurement, 
boolean isTableModel)
       throws IllegalPathException {
     PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> 
allModifications =
         modificationCacheMap.get(tsFileResource.getTsFile().getName());
@@ -482,7 +482,8 @@ public abstract class SeriesCompactionExecutor {
         allModifications,
         deviceId,
         measurement,
-        compactionWriter.getTTLLowerBoundForCurrentDevice());
+        compactionWriter.getTTLLowerBoundForCurrentDevice(),
+        isTableModel);
   }
 
   @SuppressWarnings("squid:S3776")
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java
index 61f8229cd3c..774a1d3cfe9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SettleSelectorImpl.java
@@ -23,6 +23,7 @@ import 
org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.AlignedPath;
 import org.apache.iotdb.commons.path.PatternTreeMap;
 import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
+import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.i18n.StorageEngineMessages;
@@ -67,6 +68,7 @@ public class SettleSelectorImpl implements ISettleSelector {
   private final boolean heavySelect;
   private final String storageGroupName;
   private final String dataRegionId;
+  private final boolean isTableModel;
   private final long timePartition;
   private final TsFileManager tsFileManager;
   private boolean isSeq;
@@ -83,6 +85,7 @@ public class SettleSelectorImpl implements ISettleSelector {
     this.heavySelect = heavySelect;
     this.storageGroupName = storageGroupName;
     this.dataRegionId = dataRegionId;
+    this.isTableModel = PathUtils.isTableModelDatabase(storageGroupName);
     this.timePartition = timePartition;
     this.tsFileManager = tsFileManager;
     this.context = context;
@@ -261,7 +264,7 @@ public class SettleSelectorImpl implements ISettleSelector {
       long ttl;
       String tableName = device.getTableName();
       boolean hasSetTTL;
-      if (tableName.startsWith("root.")) {
+      if (!isTableModel) {
         ttl = DataNodeTTLCache.getInstance().getTTLForTree(device);
         hasSetTTL = ttl != Long.MAX_VALUE;
       } else {
@@ -327,7 +330,7 @@ public class SettleSelectorImpl implements ISettleSelector {
       throws IllegalPathException {
     return ModificationUtils.isAllDeletedByMods(
         CompactionUtils.getMatchedModifications(
-            modifications, device, AlignedPath.VECTOR_PLACEHOLDER, null),
+            modifications, device, AlignedPath.VECTOR_PLACEHOLDER, null, 
isTableModel),
         startTime,
         endTime);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
index 0ea1abee866..e6dd6170ae6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
@@ -280,16 +280,17 @@ public class ModificationUtils {
       final PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> 
modifications,
       final IDeviceID device,
       final long startTime,
-      final long endTime)
+      final long endTime,
+      final boolean isTableModel)
       throws IllegalPathException {
     final List<ModEntry> mods =
         modifications.getOverlapped(
-            CompactionPathUtils.getPath(device, 
AlignedPath.VECTOR_PLACEHOLDER));
+            CompactionPathUtils.getPath(device, 
AlignedPath.VECTOR_PLACEHOLDER, isTableModel));
     return mods.stream()
         .anyMatch(
             modification ->
                 modification.getTimeRange().contains(startTime, endTime)
-                    && (!device.isTableModel() || 
modification.affects(device)));
+                    && (!isTableModel || modification.affects(device)));
   }
 
   public static boolean isAllDeletedByMods(
@@ -310,15 +311,16 @@ public class ModificationUtils {
       final IDeviceID device,
       final String measurement,
       final long startTime,
-      final long endTime)
+      final long endTime,
+      final boolean isTableModel)
       throws IllegalPathException {
     final List<ModEntry> mods =
-        modifications.getOverlapped(CompactionPathUtils.getPath(device, 
measurement));
+        modifications.getOverlapped(CompactionPathUtils.getPath(device, 
measurement, isTableModel));
     return mods.stream()
         .anyMatch(
             modification ->
                 modification.getTimeRange().contains(startTime, endTime)
-                    && (!device.isTableModel()
+                    && (!isTableModel
                         || modification.affects(device) && 
modification.affects(measurement)));
   }
 
@@ -452,7 +454,8 @@ public class ModificationUtils {
   public static boolean isDeviceDeletedByMods(
       final PatternTreeMap<ModEntry, PatternTreeMapFactory.ModsSerializer> 
currentModifications,
       final ITimeIndex currentTimeIndex,
-      final IDeviceID device)
+      final IDeviceID device,
+      final boolean isTableModel)
       throws IllegalPathException {
     return isAllDeletedByMods(
         currentModifications,
@@ -462,6 +465,7 @@ public class ModificationUtils {
             : currentTimeIndex.getStartTime(device).orElse(Long.MIN_VALUE),
         Objects.isNull(currentTimeIndex)
             ? Long.MAX_VALUE
-            : currentTimeIndex.getEndTime(device).orElse(Long.MAX_VALUE));
+            : currentTimeIndex.getEndTime(device).orElse(Long.MAX_VALUE),
+        isTableModel);
   }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
index 2a0890e6277..f7c0ab41053 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
@@ -59,10 +59,11 @@ public class CompactionUtilsTest extends 
AbstractCompactionTest {
     IDeviceID deviceID = new StringArrayDeviceID(new String[] {"db.table1", 
null, "tag1"});
 
     Assert.assertArrayEquals(
-        new String[] {"db.table1", null, "tag1"}, 
CompactionPathUtils.getPath(deviceID).getNodes());
+        new String[] {"db.table1", null, "tag1"},
+        CompactionPathUtils.getPath(deviceID, true).getNodes());
     Assert.assertArrayEquals(
         new String[] {"db.table1", null, "tag1", "s1"},
-        CompactionPathUtils.getPath(deviceID, "s1").getNodes());
+        CompactionPathUtils.getPath(deviceID, "s1", true).getNodes());
   }
 
   @Test
@@ -71,9 +72,9 @@ public class CompactionUtilsTest extends 
AbstractCompactionTest {
     IDeviceID deviceID = deletionPath.getIDeviceID();
 
     Assert.assertArrayEquals(
-        new String[] {"root", "repro"}, 
CompactionPathUtils.getPath(deviceID).getNodes());
+        new String[] {"root", "repro"}, CompactionPathUtils.getPath(deviceID, 
false).getNodes());
     Assert.assertArrayEquals(
-        deletionPath.getNodes(), CompactionPathUtils.getPath(deviceID, 
"s1").getNodes());
+        deletionPath.getNodes(), CompactionPathUtils.getPath(deviceID, "s1", 
false).getNodes());
 
     TreeDeletionEntry deletion =
         new TreeDeletionEntry(deletionPath, Long.MIN_VALUE, Long.MAX_VALUE);
@@ -82,7 +83,7 @@ public class CompactionUtilsTest extends 
AbstractCompactionTest {
     modifications.append(deletion.keyOfPatternTree(), deletion);
 
     List<ModEntry> matchedModifications =
-        CompactionUtils.getMatchedModifications(modifications, deviceID, "s1", 
null);
+        CompactionUtils.getMatchedModifications(modifications, deviceID, "s1", 
null, false);
     Assert.assertEquals(1, matchedModifications.size());
     Assert.assertEquals(
         deletionPath, ((TreeDeletionEntry) 
matchedModifications.get(0)).getPathPattern());

Reply via email to