in java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/AbstractAlignedChunkReader.java [184:251]
private AbstractAlignedPageReader constructAlignedPageReader(
PageHeader timePageHeader, List<PageHeader> rawValuePageHeaderList) throws IOException {
IDecryptor decrytor = IDecryptor.getDecryptor(encryptParam);
ByteBuffer timePageData =
ChunkReader.deserializePageData(
timePageHeader, timeChunkDataBuffer, timeChunkHeader, decrytor);
List<PageHeader> valuePageHeaderList = new ArrayList<>();
LazyLoadPageData[] lazyLoadPageDataArray = new LazyLoadPageData[rawValuePageHeaderList.size()];
List<TSDataType> valueDataTypeList = new ArrayList<>();
List<Decoder> valueDecoderList = new ArrayList<>();
boolean isAllNull = true;
for (int i = 0; i < rawValuePageHeaderList.size(); i++) {
PageHeader valuePageHeader = rawValuePageHeaderList.get(i);
if (valuePageHeader == null || valuePageHeader.getUncompressedSize() == 0) {
// Empty Page
valuePageHeaderList.add(null);
lazyLoadPageDataArray[i] = null;
valueDataTypeList.add(null);
valueDecoderList.add(null);
} else if (pageDeleted(valuePageHeader, valueDeleteIntervalsList.get(i))) {
valueChunkDataBufferList
.get(i)
.position(
valueChunkDataBufferList.get(i).position() + valuePageHeader.getCompressedSize());
valuePageHeaderList.add(null);
lazyLoadPageDataArray[i] = null;
valueDataTypeList.add(null);
valueDecoderList.add(null);
} else {
ChunkHeader valueChunkHeader = valueChunkHeaderList.get(i);
int currentPagePosition = valueChunkDataBufferList.get(i).position();
// adjust position as if we have read the page data even if it is just lazy-loaded
valueChunkDataBufferList
.get(i)
.position(
valueChunkDataBufferList.get(i).position() + valuePageHeader.getCompressedSize());
valuePageHeaderList.add(valuePageHeader);
lazyLoadPageDataArray[i] =
new LazyLoadPageData(
valueChunkDataBufferList.get(i).array(),
currentPagePosition,
IUnCompressor.getUnCompressor(valueChunkHeader.getCompressionType()),
encryptParam);
valueDataTypeList.add(valueChunkHeader.getDataType());
valueDecoderList.add(
Decoder.getDecoderByType(
valueChunkHeader.getEncodingType(), valueChunkHeader.getDataType()));
isAllNull = false;
}
}
if (canSkip(isAllNull, timePageHeader)) {
return null;
}
return constructPageReader(
timePageHeader,
timePageData,
defaultTimeDecoder,
valuePageHeaderList,
lazyLoadPageDataArray,
valueDataTypeList,
valueDecoderList,
queryFilter,
valueDeleteIntervalsList);
}