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

jackietien pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/tsfile.git


The following commit(s) were added to refs/heads/develop by this push:
     new 697df935 Fix value and time chunk misalignment when rewriting with 
time deletion (#719)
697df935 is described below

commit 697df9358befb8f1a22b5856615f098560ed9043
Author: shuwenwei <[email protected]>
AuthorDate: Tue Feb 3 10:00:55 2026 +0800

    Fix value and time chunk misalignment when rewriting with time deletion 
(#719)
---
 .../java/org/apache/tsfile/read/common/Chunk.java  | 11 +++-
 .../org/apache/tsfile/write/ChunkRewriteTest.java  | 72 ++++++++++++++++++++++
 2 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
index 01937c74..55036107 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
@@ -234,7 +234,16 @@ public class Chunk {
             encryptParam);
     List<Chunk> valueChunks = new ArrayList<>();
     valueChunks.add(this);
-    TableChunkReader chunkReader = new TableChunkReader(timeChunk, 
valueChunks, null);
+    TableChunkReader chunkReader =
+        new TableChunkReader(
+            new Chunk(
+                timeChunk.getHeader(),
+                timeChunk.getData(),
+                null,
+                timeChunk.getChunkStatistic(),
+                timeChunk.getEncryptParam()),
+            valueChunks,
+            null);
     List<IPageReader> pages = chunkReader.loadPageReaderList();
     for (IPageReader page : pages) {
       IPointReader pointReader = 
page.getAllSatisfiedPageData().getBatchDataIterator();
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/write/ChunkRewriteTest.java 
b/java/tsfile/src/test/java/org/apache/tsfile/write/ChunkRewriteTest.java
index 30e36055..f9d7a426 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/write/ChunkRewriteTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/write/ChunkRewriteTest.java
@@ -24,6 +24,7 @@ import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.read.TimeValuePair;
 import org.apache.tsfile.read.common.BatchData;
 import org.apache.tsfile.read.common.Chunk;
+import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.read.reader.IPageReader;
 import org.apache.tsfile.read.reader.IPointReader;
 import org.apache.tsfile.read.reader.chunk.AlignedChunkReader;
@@ -43,6 +44,7 @@ import org.junit.Test;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -118,6 +120,76 @@ public class ChunkRewriteTest {
 
   }
 
+  @Test
+  public void AlignedChunkSinglePageWithTimeDeletionTest() throws IOException {
+    String[] measurements = new String[] {"s1", "s2", "s3"};
+    TSDataType[] types = new TSDataType[] {TSDataType.FLOAT, TSDataType.INT32, 
TSDataType.DOUBLE};
+    VectorMeasurementSchema measurementSchema =
+        new VectorMeasurementSchema("table1.d1", measurements, types);
+    AlignedChunkWriterImpl chunkWriter = new 
AlignedChunkWriterImpl(measurementSchema);
+
+    for (int time = 1; time <= 20; time++) {
+      chunkWriter.write(time, (float) time, false);
+      chunkWriter.write(time, time, false);
+      chunkWriter.write(time, (double) time, false);
+      chunkWriter.write(time);
+    }
+    chunkWriter.sealCurrentPage();
+
+    TimeChunkWriter timeChunkWriter = chunkWriter.getTimeChunkWriter();
+    List<ValueChunkWriter> valueChunkWriters = 
chunkWriter.getValueChunkWriterList();
+
+    Chunk timeChunk = getTimeChunk(measurementSchema, timeChunkWriter);
+
+    List<Chunk> valueChunks = getValueChunks(valueChunkWriters);
+
+    AlignedChunkReader chunkReader = new AlignedChunkReader(timeChunk, 
valueChunks);
+    List<IPageReader> pageReaders = chunkReader.loadPageReaderList();
+    for (IPageReader page : pageReaders) {
+      IPointReader pointReader = ((AlignedPageReader) 
page).getLazyPointReader();
+      int i = 1;
+      while (pointReader.hasNextTimeValuePair()) {
+        TimeValuePair point = pointReader.nextTimeValuePair();
+        assertEquals((long) i, point.getTimestamp());
+        assertEquals((float) i, point.getValue().getVector()[0].getValue());
+        assertEquals(i, point.getValue().getVector()[1].getValue());
+        assertEquals((double) i, point.getValue().getVector()[2].getValue());
+        i++;
+      }
+    }
+    timeChunk.getData().flip();
+    valueChunks.get(0).getData().flip();
+    valueChunks.get(1).getData().flip();
+    valueChunks.get(2).getData().flip();
+    // delete
+    timeChunk.setDeleteIntervalList(Collections.singletonList(new TimeRange(0, 
9)));
+    // rewrite INT32->DOUBLE
+    Chunk newValueChunk = valueChunks.get(1).rewrite(TSDataType.DOUBLE, 
timeChunk);
+    valueChunks.set(1, newValueChunk);
+    TableChunkReader newChunkReader = new TableChunkReader(timeChunk, 
valueChunks, null);
+    List<IPageReader> newPageReaders = newChunkReader.loadPageReaderList();
+    for (IPageReader page : newPageReaders) {
+      IPointReader pointReader = 
page.getAllSatisfiedPageData().getBatchDataIterator();
+      int i = 1;
+      while (pointReader.hasNextTimeValuePair()) {
+        TimeValuePair point = pointReader.nextTimeValuePair();
+        assertEquals((long) i + 9, point.getTimestamp());
+        assertEquals((float) (i + 9), 
point.getValue().getVector()[0].getValue());
+        assertEquals((double) (i + 9), 
point.getValue().getVector()[1].getValue());
+        assertEquals((double) (i + 9), 
point.getValue().getVector()[2].getValue());
+        i++;
+      }
+      assertEquals(11, i - 1);
+    }
+    timeChunk.getData().flip();
+    valueChunks.get(0).getData().flip();
+    valueChunks.get(1).getData().flip();
+    valueChunks.get(2).getData().flip();
+
+    //
+
+  }
+
   @Test
   public void AlignedChunkMultiPagesTest() throws IOException {
     String[] measurements = new String[] {"s1", "s2", "s3"};

Reply via email to