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

haonan pushed a commit to branch fix_force_Append_Writer
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit a10e7729c3badaf732a92f09ffcb904f393d86a9
Author: HTHou <[email protected]>
AuthorDate: Wed May 27 16:57:24 2020 +0800

    fix ForceAppendTsFileWriter
---
 .../write/writer/ForceAppendTsFileWriter.java      | 19 ++++++++++
 .../write/writer/ForceAppendTsFileWriterTest.java  | 41 ++++++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java
index f23e99b..0938e0a 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriter.java
@@ -20,7 +20,12 @@ package org.apache.iotdb.tsfile.write.writer;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.iotdb.tsfile.exception.write.TsFileNotCompleteException;
+import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata;
 import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
 import org.slf4j.Logger;
@@ -57,6 +62,20 @@ public class ForceAppendTsFileWriter extends TsFileIOWriter {
       TsFileMetadata tsFileMetadata = reader.readFileMetadata();
       // truncate metadata and marker
       truncatePosition = tsFileMetadata.getMetaOffset();
+
+      canWrite = true;
+      versionInfo = tsFileMetadata.getVersionInfo();
+      totalChunkNum = tsFileMetadata.getTotalChunkNum();
+      invalidChunkNum = tsFileMetadata.getInvalidChunkNum();
+      
+      List<String> devices = reader.getAllDevices();
+      for (String device : devices) {
+        List<ChunkMetadata> chunkMetadataList = new ArrayList<>();
+        reader.readChunkMetadataInDevice(device).values()
+            .forEach(list -> chunkMetadataList.addAll(list));            
+        ChunkGroupMetadata chunkGroupMetadata = new ChunkGroupMetadata(device, 
chunkMetadataList);
+        chunkGroupMetadataList.add(chunkGroupMetadata);
+      }
     }
   }
 
diff --git 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java
 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java
index 694d7c1..359da39 100644
--- 
a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java
+++ 
b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/ForceAppendTsFileWriterTest.java
@@ -19,15 +19,24 @@
 package org.apache.iotdb.tsfile.write.writer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.iotdb.tsfile.constant.TestConstant;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
 import org.apache.iotdb.tsfile.fileSystem.fsFactory.FSFactory;
+import org.apache.iotdb.tsfile.read.ReadOnlyTsFile;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.common.RowRecord;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.write.TsFileWriter;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.record.datapoint.FloatDataPoint;
@@ -56,6 +65,38 @@ public class ForceAppendTsFileWriterTest {
     writer.close();
     ForceAppendTsFileWriter fwriter = new ForceAppendTsFileWriter(file);
     assertEquals(firstMetadataPosition, fwriter.getTruncatePosition());
+
+    // write more data into this TsFile
+    writer = new TsFileWriter(fwriter);
+    writer.registerTimeseries(new Path("d1.s1"),
+        new MeasurementSchema("s1", TSDataType.FLOAT, TSEncoding.RLE));
+    writer.registerTimeseries(new Path("d1.s2"),
+        new MeasurementSchema("s2", TSDataType.FLOAT, TSEncoding.RLE));
+    writer.write(new TSRecord(3, "d1").addTuple(new FloatDataPoint("s1", 5))
+        .addTuple(new FloatDataPoint("s2", 4)));
+    writer.close();
+    ReadOnlyTsFile readOnlyTsFile = new ReadOnlyTsFile(new 
TsFileSequenceReader(file.getPath()));
+    List<Path> pathList = new ArrayList<>();
+    pathList.add(new Path("d1", "s1"));
+    pathList.add(new Path("d1", "s2"));
+    QueryExpression queryExpression = QueryExpression.create(pathList, null);
+    QueryDataSet dataSet = readOnlyTsFile.query(queryExpression);
+    RowRecord record = dataSet.next();
+    assertEquals(1, record.getTimestamp());
+    assertEquals(5.0f, record.getFields().get(0).getFloatV(), 0.001);
+    assertEquals(4.0f, record.getFields().get(1).getFloatV(), 0.001);
+    record = dataSet.next();
+    assertEquals(2, record.getTimestamp());
+    assertEquals(5.0f, record.getFields().get(0).getFloatV(), 0.001);
+    assertEquals(4.0f, record.getFields().get(1).getFloatV(), 0.001);
+    record = dataSet.next();
+    assertEquals(3, record.getTimestamp());
+    assertEquals(5.0f, record.getFields().get(0).getFloatV(), 0.001);
+    assertEquals(4.0f, record.getFields().get(1).getFloatV(), 0.001);
+    readOnlyTsFile.close();
+    assertFalse(dataSet.hasNext());
+
+    assertTrue(file.delete());
   }
 
 }

Reply via email to