blob: 4166a1aa49a623162ac98d18ebce0af429ae0890 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.readchunk.loader;
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.executor.ModifiedStatus;
import org.apache.iotdb.tsfile.file.MetaMarker;
import org.apache.iotdb.tsfile.file.header.ChunkHeader;
import org.apache.iotdb.tsfile.file.header.PageHeader;
import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
import org.apache.iotdb.tsfile.read.common.Chunk;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class InstantChunkLoader extends ChunkLoader {
private Chunk chunk;
public InstantChunkLoader() {}
public InstantChunkLoader(ChunkMetadata chunkMetadata, Chunk chunk) {
super(chunkMetadata);
this.chunk = chunk;
}
@Override
public Chunk getChunk() {
return chunk;
}
@Override
public boolean isEmpty() {
return chunkMetadata == null
|| chunk == null
|| chunkMetadata.getNumOfPoints() == 0
|| this.modifiedStatus == ModifiedStatus.ALL_DELETED;
}
@Override
public ChunkHeader getHeader() {
if (chunk == null) {
return null;
}
return chunk.getHeader();
}
@Override
public List<PageLoader> getPages() {
if (chunk == null) {
return Collections.emptyList();
}
ByteBuffer chunkData = chunk.getData();
List<PageLoader> pageList = new ArrayList<>();
while (chunkData.hasRemaining()) {
PageHeader pageHeader;
if (((byte) (chunk.getHeader().getChunkType() & 0x3F))
== MetaMarker.ONLY_ONE_PAGE_CHUNK_HEADER) {
pageHeader = PageHeader.deserializeFrom(chunkData, chunk.getChunkStatistic());
} else {
pageHeader = PageHeader.deserializeFrom(chunkData, chunk.getChunkStatistic().getType());
}
int pageSize = pageHeader.getCompressedSize();
byte[] pageBody = new byte[pageSize];
chunkData.get(pageBody);
ModifiedStatus pageModifiedStatus = calculatePageModifiedStatus(pageHeader);
pageHeader.setModified(pageModifiedStatus != ModifiedStatus.NONE_DELETED);
pageList.add(
new InstantPageLoader(
pageHeader,
ByteBuffer.wrap(pageBody),
chunk.getHeader().getCompressionType(),
chunk.getHeader().getDataType(),
chunk.getHeader().getEncodingType(),
chunkMetadata.getDeleteIntervalList(),
pageModifiedStatus));
}
return pageList;
}
@Override
public void clear() {
this.chunk = null;
this.chunkMetadata = null;
}
}