in java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java [317:385]
public Chunk rewrite(TSDataType newType) throws IOException {
if (newType == null || newType == chunkHeader.getDataType()) {
return this;
}
TSEncoding encoding =
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getValueEncoder(newType));
IMeasurementSchema schema =
new MeasurementSchema(
chunkHeader.getMeasurementID(), newType, encoding, chunkHeader.getCompressionType());
ChunkWriterImpl chunkWriter = new ChunkWriterImpl(schema, encryptParam);
ChunkReader chunkReader = new ChunkReader(this);
List<IPageReader> pages = chunkReader.loadPageReaderList();
for (IPageReader page : pages) {
BatchData batchData = page.getAllSatisfiedPageData();
IPointReader pointReader = batchData.getBatchDataIterator();
while (pointReader.hasNextTimeValuePair()) {
TimeValuePair point = pointReader.nextTimeValuePair();
Object convertedValue =
newType.castFromSingleValue(chunkHeader.getDataType(), point.getValue().getValue());
long timestamp = point.getTimestamp();
if (convertedValue == null) {
throw new IOException("NonAlignedChunk contains null, timestamp: " + timestamp);
}
switch (newType) {
case BOOLEAN:
chunkWriter.write(timestamp, (boolean) convertedValue);
break;
case DATE:
case INT32:
chunkWriter.write(timestamp, (int) convertedValue);
break;
case TIMESTAMP:
case INT64:
chunkWriter.write(timestamp, (long) convertedValue);
break;
case FLOAT:
chunkWriter.write(timestamp, (float) convertedValue);
break;
case DOUBLE:
chunkWriter.write(timestamp, (double) convertedValue);
break;
case TEXT:
case STRING:
case BLOB:
chunkWriter.write(timestamp, (Binary) convertedValue);
break;
default:
throw new IOException("Unsupported data type: " + newType);
}
}
chunkWriter.sealCurrentPage();
}
ByteBuffer newChunkData = chunkWriter.getByteBuffer();
ChunkHeader newChunkHeader =
new ChunkHeader(
chunkHeader.getChunkType(),
chunkHeader.getMeasurementID(),
newChunkData.capacity(),
newType,
chunkHeader.getCompressionType(),
encoding);
chunkData.flip();
return new Chunk(
newChunkHeader,
newChunkData,
deleteIntervalList,
chunkWriter.getStatistics(),
encryptParam);
}