in java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java [2614:2680]
public List<AbstractAlignedChunkMetadata> getAlignedChunkMetadataByMetadataIndexNode(
IDeviceID device, MetadataIndexNode metadataIndexNode, boolean ignoreAllNullRows)
throws IOException {
TimeseriesMetadata firstTimeseriesMetadata = getTimeColumnMetadata(metadataIndexNode);
if (firstTimeseriesMetadata == null) {
throw new IOException("Timeseries of device {" + device + "} are not aligned");
}
Map<IDeviceID, List<TimeseriesMetadata>> timeseriesMetadataMap = new TreeMap<>();
List<IMetadataIndexEntry> metadataIndexEntryList = metadataIndexNode.getChildren();
for (int i = 0; i < metadataIndexEntryList.size(); i++) {
IMetadataIndexEntry metadataIndexEntry = metadataIndexEntryList.get(i);
long endOffset = metadataIndexNode.getEndOffset();
if (i != metadataIndexEntryList.size() - 1) {
endOffset = metadataIndexEntryList.get(i + 1).getOffset();
}
ByteBuffer buffer = readData(metadataIndexEntry.getOffset(), endOffset);
if (metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
while (buffer.hasRemaining()) {
timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
}
timeseriesMetadataMap
.computeIfAbsent(device, k -> new ArrayList<>())
.addAll(timeseriesMetadataList);
} else {
generateMetadataIndex(
metadataIndexEntry,
buffer,
device,
metadataIndexNode.getNodeType(),
timeseriesMetadataMap,
true);
}
}
if (timeseriesMetadataMap.values().size() != 1) {
throw new IOException(
String.format(
"Error when reading timeseriesMetadata of device %s in file %s: should only one timeseriesMetadataList in one device, actual: %d",
device, file, timeseriesMetadataMap.values().size()));
}
List<TimeseriesMetadata> timeseriesMetadataList =
timeseriesMetadataMap.values().iterator().next();
TimeseriesMetadata timeseriesMetadata = timeseriesMetadataList.get(0);
List<TimeseriesMetadata> valueTimeseriesMetadataList = new ArrayList<>();
for (int i = 1; i < timeseriesMetadataList.size(); i++) {
valueTimeseriesMetadataList.add(timeseriesMetadataList.get(i));
}
AbstractAlignedTimeSeriesMetadata alignedTimeSeriesMetadata;
if (ignoreAllNullRows) {
alignedTimeSeriesMetadata =
new AlignedTimeSeriesMetadata(timeseriesMetadata, valueTimeseriesMetadataList);
} else {
alignedTimeSeriesMetadata =
new TableDeviceTimeSeriesMetadata(timeseriesMetadata, valueTimeseriesMetadataList);
}
List<AbstractAlignedChunkMetadata> chunkMetadataList = new ArrayList<>();
for (IChunkMetadata chunkMetadata : readIChunkMetaDataList(alignedTimeSeriesMetadata)) {
chunkMetadataList.add((AbstractAlignedChunkMetadata) chunkMetadata);
}
return chunkMetadataList;
}