This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch TYQuery in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 0ab98773292febc422213ca28eb647df1bf909d3 Author: JackieTien97 <[email protected]> AuthorDate: Thu Mar 11 18:06:57 2021 +0800 make the timeseries metadata and chunk metadata to be interface --- .../chunk/metadata/DiskChunkMetadataLoader.java | 15 ++- .../iotdb/db/query/reader/series/SeriesReader.java | 40 ++++---- .../org/apache/iotdb/db/utils/FileLoaderUtils.java | 41 ++++---- .../java/org/apache/iotdb/db/utils/QueryUtils.java | 11 +- .../iotdb/tsfile/file/metadata/ChunkMetadata.java | 10 +- .../iotdb/tsfile/file/metadata/IChunkMetadata.java | 26 +++++ .../tsfile/file/metadata/ITimeSeriesMetadata.java | 2 + .../tsfile/file/metadata/TimeseriesMetadata.java | 16 ++- .../tsfile/file/metadata/VectorChunkMetadata.java | 114 +++++++++++++++++++-- .../file/metadata/VectorTimeSeriesMetadata.java | 35 ++++++- .../iotdb/tsfile/read/TsFileSequenceReader.java | 77 +++++++------- .../read/controller/IChunkMetadataLoader.java | 7 +- .../tsfile/read/controller/IMetadataQuerier.java | 13 ++- .../read/controller/MetadataQuerierByFileImpl.java | 49 +++++---- .../tsfile/v2/read/TsFileSequenceReaderForV2.java | 48 ++++----- 15 files changed, 336 insertions(+), 168 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java index ebb9521..e3dc79e 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java +++ b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java @@ -18,19 +18,18 @@ */ package org.apache.iotdb.db.query.reader.chunk.metadata; +import java.util.List; import org.apache.iotdb.db.engine.modification.Modification; import org.apache.iotdb.db.engine.storagegroup.TsFileResource; import org.apache.iotdb.db.metadata.PartialPath; import org.apache.iotdb.db.query.context.QueryContext; import org.apache.iotdb.db.query.reader.chunk.DiskChunkLoader; import org.apache.iotdb.db.utils.QueryUtils; -import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; -import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata; import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader; import org.apache.iotdb.tsfile.read.filter.basic.Filter; -import java.util.List; - public class DiskChunkMetadataLoader implements IChunkMetadataLoader { private final TsFileResource resource; @@ -48,8 +47,8 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader { } @Override - public List<ChunkMetadata> loadChunkMetadataList(TimeseriesMetadata timeseriesMetadata) { - List<ChunkMetadata> chunkMetadataList = timeseriesMetadata.getChunkMetadataList(); + public List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeseriesMetadata) { + List<IChunkMetadata> chunkMetadataList = timeseriesMetadata.getChunkMetadataList(); setDiskChunkLoader(chunkMetadataList, resource, seriesPath, context); @@ -64,7 +63,7 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader { || chunkMetaData.getStartTime() > chunkMetaData.getEndTime()); // For chunkMetadata from old TsFile, do not set version - for (ChunkMetadata metadata : chunkMetadataList) { + for (IChunkMetadata metadata : chunkMetadataList) { if (!metadata.isFromOldTsFile()) { metadata.setVersion(resource.getVersion()); } @@ -73,7 +72,7 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader { } public static void setDiskChunkLoader( - List<ChunkMetadata> chunkMetadataList, + List<IChunkMetadata> chunkMetadataList, TsFileResource resource, PartialPath seriesPath, QueryContext context) { diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java index 01cb4f1..27a3e3f 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java +++ b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java @@ -18,6 +18,16 @@ */ package org.apache.iotdb.db.query.reader.series; +import java.io.IOException; +import java.io.Serializable; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.function.ToLongFunction; +import java.util.stream.Collectors; import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.engine.querycontext.QueryDataSource; import org.apache.iotdb.db.engine.storagegroup.TsFileResource; @@ -32,7 +42,8 @@ import org.apache.iotdb.db.query.reader.universal.PriorityMergeReader.MergeReade import org.apache.iotdb.db.utils.FileLoaderUtils; import org.apache.iotdb.db.utils.QueryUtils; import org.apache.iotdb.db.utils.TestOnly; -import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata; import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics; @@ -43,17 +54,6 @@ import org.apache.iotdb.tsfile.read.filter.basic.Filter; import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter; import org.apache.iotdb.tsfile.read.reader.IPageReader; -import java.io.IOException; -import java.io.Serializable; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; -import java.util.PriorityQueue; -import java.util.Set; -import java.util.function.ToLongFunction; -import java.util.stream.Collectors; - public class SeriesReader { // inner class of SeriesReader for order purpose @@ -84,15 +84,15 @@ public class SeriesReader { /* * TimeSeriesMetadata cache */ - private TimeseriesMetadata firstTimeSeriesMetadata; - private final List<TimeseriesMetadata> seqTimeSeriesMetadata = new LinkedList<>(); - private final PriorityQueue<TimeseriesMetadata> unSeqTimeSeriesMetadata; + private ITimeSeriesMetadata firstTimeSeriesMetadata; + private final List<ITimeSeriesMetadata> seqTimeSeriesMetadata = new LinkedList<>(); + private final PriorityQueue<ITimeSeriesMetadata> unSeqTimeSeriesMetadata; /* * chunk cache */ - private ChunkMetadata firstChunkMetadata; - private final PriorityQueue<ChunkMetadata> cachedChunkMetadata; + private IChunkMetadata firstChunkMetadata; + private final PriorityQueue<IChunkMetadata> cachedChunkMetadata; /* * page cache @@ -328,9 +328,9 @@ public class SeriesReader { } } - private void unpackOneTimeSeriesMetadata(TimeseriesMetadata timeSeriesMetadata) + private void unpackOneTimeSeriesMetadata(ITimeSeriesMetadata timeSeriesMetadata) throws IOException { - List<ChunkMetadata> chunkMetadataList = + List<IChunkMetadata> chunkMetadataList = FileLoaderUtils.loadChunkMetadataList(timeSeriesMetadata); chunkMetadataList.forEach(chunkMetadata -> chunkMetadata.setSeq(timeSeriesMetadata.isSeq())); @@ -508,7 +508,7 @@ public class SeriesReader { } } - private void unpackOneChunkMetaData(ChunkMetadata chunkMetaData) throws IOException { + private void unpackOneChunkMetaData(IChunkMetadata chunkMetaData) throws IOException { FileLoaderUtils.loadPageReaderList(chunkMetaData, timeFilter) .forEach( pageReader -> { diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java index a829b69..c241d2f 100644 --- a/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java +++ b/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java @@ -18,6 +18,10 @@ */ package org.apache.iotdb.db.utils; +import java.io.IOException; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; import org.apache.iotdb.db.engine.cache.TimeSeriesMetadataCache; import org.apache.iotdb.db.engine.modification.Modification; import org.apache.iotdb.db.engine.storagegroup.TsFileResource; @@ -29,8 +33,10 @@ import org.apache.iotdb.db.query.reader.chunk.MemChunkReader; import org.apache.iotdb.db.query.reader.chunk.metadata.DiskChunkMetadataLoader; import org.apache.iotdb.db.query.reader.chunk.metadata.MemChunkMetadataLoader; import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata; import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; -import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; +import org.apache.iotdb.tsfile.file.metadata.VectorChunkMetadata; import org.apache.iotdb.tsfile.read.TsFileSequenceReader; import org.apache.iotdb.tsfile.read.common.Chunk; import org.apache.iotdb.tsfile.read.common.Path; @@ -39,11 +45,7 @@ import org.apache.iotdb.tsfile.read.filter.basic.Filter; import org.apache.iotdb.tsfile.read.reader.IChunkReader; import org.apache.iotdb.tsfile.read.reader.IPageReader; import org.apache.iotdb.tsfile.read.reader.chunk.ChunkReader; - -import java.io.IOException; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; +import org.apache.iotdb.tsfile.read.reader.chunk.VectorChunkReader; public class FileLoaderUtils { @@ -140,7 +142,7 @@ public class FileLoaderUtils { * * @param timeSeriesMetadata the corresponding TimeSeriesMetadata in that file. */ - public static List<ChunkMetadata> loadChunkMetadataList(TimeseriesMetadata timeSeriesMetadata) + public static List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeSeriesMetadata) throws IOException { return timeSeriesMetadata.loadChunkMetadataList(); } @@ -151,8 +153,9 @@ public class FileLoaderUtils { * @param chunkMetaData the corresponding chunk metadata * @param timeFilter it should be a TimeFilter instead of a ValueFilter */ - public static List<IPageReader> loadPageReaderList(ChunkMetadata chunkMetaData, Filter timeFilter) + public static List<IPageReader> loadPageReaderList(IChunkMetadata chunkMetaData, Filter timeFilter) throws IOException { + // TODO memory Vector chunk metadata if (chunkMetaData == null) { throw new IOException("Can't init null chunkMeta"); } @@ -162,22 +165,24 @@ public class FileLoaderUtils { MemChunkLoader memChunkLoader = (MemChunkLoader) chunkLoader; chunkReader = new MemChunkReader(memChunkLoader.getChunk(), timeFilter); } else { - Chunk chunk = chunkLoader.loadChunk(chunkMetaData); - chunk.setFromOldFile(chunkMetaData.isFromOldTsFile()); - chunkReader = new ChunkReader(chunk, timeFilter); - chunkReader.hasNextSatisfiedPage(); + if (chunkMetaData instanceof ChunkMetadata) { + Chunk chunk = chunkLoader.loadChunk((ChunkMetadata) chunkMetaData); + chunk.setFromOldFile(chunkMetaData.isFromOldTsFile()); + chunkReader = new ChunkReader(chunk, timeFilter); + chunkReader.hasNextSatisfiedPage(); + } else { + VectorChunkMetadata vectorChunkMetadata = (VectorChunkMetadata) chunkMetaData; + Chunk timeChunk = vectorChunkMetadata.getTimeChunk(); + List<Chunk> valueChunkList = vectorChunkMetadata.getValueChunkList(); + chunkReader = new VectorChunkReader(timeChunk, valueChunkList, timeFilter); + } } return chunkReader.loadPageReaderList(); } - public static List<ChunkMetadata> getChunkMetadataList(Path path, String filePath) + public static List<IChunkMetadata> getChunkMetadataList(Path path, String filePath) throws IOException { TsFileSequenceReader tsFileReader = FileReaderManager.getInstance().get(filePath, true); return tsFileReader.getChunkMetadataList(path); } - - public static TsFileMetadata getTsFileMetadata(String filePath) throws IOException { - TsFileSequenceReader reader = FileReaderManager.getInstance().get(filePath, true); - return reader.readFileMetadata(); - } } diff --git a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java index 5c0409f..194def7 100644 --- a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java +++ b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java @@ -19,16 +19,15 @@ package org.apache.iotdb.db.utils; +import java.util.List; import org.apache.iotdb.db.engine.modification.Deletion; import org.apache.iotdb.db.engine.modification.Modification; import org.apache.iotdb.db.engine.querycontext.QueryDataSource; import org.apache.iotdb.db.engine.storagegroup.TsFileResource; import org.apache.iotdb.db.query.filter.TsFileFilter; -import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; import org.apache.iotdb.tsfile.read.common.TimeRange; -import java.util.List; - public class QueryUtils { private QueryUtils() { @@ -46,9 +45,9 @@ public class QueryUtils { */ @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning public static void modifyChunkMetaData( - List<ChunkMetadata> chunkMetaData, List<Modification> modifications) { + List<IChunkMetadata> chunkMetaData, List<Modification> modifications) { for (int metaIndex = 0; metaIndex < chunkMetaData.size(); metaIndex++) { - ChunkMetadata metaData = chunkMetaData.get(metaIndex); + IChunkMetadata metaData = chunkMetaData.get(metaIndex); for (Modification modification : modifications) { // When the chunkMetadata come from an old TsFile, the method modification.getFileOffset() // is gerVersionNum actually. In this case, we compare the versions of modification and @@ -86,7 +85,7 @@ public class QueryUtils { }); } - private static void doModifyChunkMetaData(Modification modification, ChunkMetadata metaData) { + private static void doModifyChunkMetaData(Modification modification, IChunkMetadata metaData) { if (modification instanceof Deletion) { Deletion deletion = (Deletion) modification; metaData.insertIntoSortedDeletions(deletion.getStartTime(), deletion.getEndTime()); diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java index de6681d..1a3859c 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Objects; /** Metadata of one chunk. */ -public class ChunkMetadata implements Accountable { +public class ChunkMetadata implements Accountable, IChunkMetadata { private String measurementUid; @@ -106,6 +106,7 @@ public class ChunkMetadata implements Accountable { * * @return Byte offset of header of this chunk (includes the marker) */ + @Override public long getOffsetOfChunkHeader() { return offsetOfChunkHeader; } @@ -114,6 +115,7 @@ public class ChunkMetadata implements Accountable { return measurementUid; } + @Override public Statistics getStatistics() { return statistics; } @@ -171,10 +173,12 @@ public class ChunkMetadata implements Accountable { return chunkMetaData; } + @Override public long getVersion() { return version; } + @Override public void setVersion(long version) { this.version = version; } @@ -239,10 +243,12 @@ public class ChunkMetadata implements Accountable { measurementUid, deleteIntervalList, tsDataType, statistics, version, offsetOfChunkHeader); } + @Override public boolean isModified() { return modified; } + @Override public void setModified(boolean modified) { this.modified = modified; } @@ -283,10 +289,12 @@ public class ChunkMetadata implements Accountable { this.ramSize = calculateRamSize(); } + @Override public void setSeq(boolean seq) { isSeq = seq; } + @Override public boolean isSeq() { return isSeq; } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java index b1259a6..95569db 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java @@ -18,7 +18,11 @@ */ package org.apache.iotdb.tsfile.file.metadata; +import java.util.List; +import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics; +import org.apache.iotdb.tsfile.read.common.TimeRange; +import org.apache.iotdb.tsfile.read.controller.IChunkLoader; public interface IChunkMetadata { @@ -37,4 +41,26 @@ public interface IChunkMetadata { void setVersion(long version); long getOffsetOfChunkHeader(); + + long getStartTime(); + + long getEndTime(); + + boolean isFromOldTsFile(); + + IChunkLoader getChunkLoader(); + + void setChunkLoader(IChunkLoader chunkLoader); + + void setFilePath(String filePath); + + void setClosed(boolean closed); + + TSDataType getDataType(); + + String getMeasurementUid(); + + void insertIntoSortedDeletions(long startTime, long endTime); + + List<TimeRange> getDeleteIntervalList(); } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java index 4029965..b508f57 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java @@ -36,4 +36,6 @@ public interface ITimeSeriesMetadata { void setSeq(boolean seq); List<IChunkMetadata> loadChunkMetadataList() throws IOException; + + List<IChunkMetadata> getChunkMetadataList(); } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java index 20dbf05..79f90fd 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java @@ -33,7 +33,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -public class TimeseriesMetadata implements Accountable { +public class TimeseriesMetadata implements Accountable, ITimeSeriesMetadata { /** used for old version tsfile */ private long startOffsetOfChunkMetaDataList; @@ -64,7 +64,7 @@ public class TimeseriesMetadata implements Accountable { // used to save chunk metadata list while serializing private PublicBAOS chunkMetadataListBuffer; - private ArrayList<ChunkMetadata> chunkMetadataList; + private ArrayList<IChunkMetadata> chunkMetadataList; public TimeseriesMetadata() {} @@ -176,6 +176,7 @@ public class TimeseriesMetadata implements Accountable { this.dataType = tsDataType; } + @Override public Statistics getStatistics() { return statistics; } @@ -188,18 +189,21 @@ public class TimeseriesMetadata implements Accountable { this.chunkMetadataLoader = chunkMetadataLoader; } - public List<ChunkMetadata> loadChunkMetadataList() throws IOException { + @Override + public List<IChunkMetadata> loadChunkMetadataList() throws IOException { return chunkMetadataLoader.loadChunkMetadataList(this); } - public List<ChunkMetadata> getChunkMetadataList() { + public List<IChunkMetadata> getChunkMetadataList() { return chunkMetadataList; } + @Override public boolean isModified() { return modified; } + @Override public void setModified(boolean modified) { this.modified = modified; } @@ -214,10 +218,12 @@ public class TimeseriesMetadata implements Accountable { return ramSize; } + @Override public void setSeq(boolean seq) { isSeq = seq; } + @Override public boolean isSeq() { return isSeq; } @@ -228,7 +234,7 @@ public class TimeseriesMetadata implements Accountable { } // For reading version-2 only - public void setChunkMetadataList(ArrayList<ChunkMetadata> chunkMetadataList) { + public void setChunkMetadataList(ArrayList<IChunkMetadata> chunkMetadataList) { this.chunkMetadataList = chunkMetadataList; } } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java index d512495..321197e 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java @@ -18,41 +18,139 @@ */ package org.apache.iotdb.tsfile.file.metadata; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics; +import org.apache.iotdb.tsfile.read.common.Chunk; +import org.apache.iotdb.tsfile.read.common.TimeRange; +import org.apache.iotdb.tsfile.read.controller.IChunkLoader; public class VectorChunkMetadata implements IChunkMetadata { + private final IChunkMetadata timeChunkMetadata; + private final List<IChunkMetadata> valueChunkMetadataList; + + public VectorChunkMetadata(IChunkMetadata timeChunkMetadata, + List<IChunkMetadata> valueChunkMetadataList) { + this.timeChunkMetadata = timeChunkMetadata; + this.valueChunkMetadataList = valueChunkMetadataList; + } + @Override public Statistics getStatistics() { - return null; + return timeChunkMetadata.getStatistics(); } @Override public boolean isModified() { - return false; + return timeChunkMetadata.isModified(); } @Override - public void setModified(boolean modified) {} + public void setModified(boolean modified) { + timeChunkMetadata.setModified(modified); + } @Override public boolean isSeq() { - return false; + return timeChunkMetadata.isSeq(); } @Override - public void setSeq(boolean seq) {} + public void setSeq(boolean seq) { + timeChunkMetadata.setSeq(seq); + } @Override public long getVersion() { - return 0; + return timeChunkMetadata.getVersion(); } @Override - public void setVersion(long version) {} + public void setVersion(long version) { + timeChunkMetadata.setVersion(version); + } @Override public long getOffsetOfChunkHeader() { - return 0; + return timeChunkMetadata.getOffsetOfChunkHeader(); + } + + @Override + public long getStartTime() { + return timeChunkMetadata.getStartTime(); + } + + @Override + public long getEndTime() { + return timeChunkMetadata.getEndTime(); + } + + @Override + public boolean isFromOldTsFile() { + return false; + } + + @Override + public IChunkLoader getChunkLoader() { + return timeChunkMetadata.getChunkLoader(); + } + + @Override + public void setChunkLoader(IChunkLoader chunkLoader) { + timeChunkMetadata.setChunkLoader(chunkLoader); + for (IChunkMetadata chunkMetadata : valueChunkMetadataList) { + chunkMetadata.setChunkLoader(chunkLoader); + } + } + + @Override + public void setFilePath(String filePath) { + timeChunkMetadata.setFilePath(filePath); + for (IChunkMetadata chunkMetadata : valueChunkMetadataList) { + chunkMetadata.setFilePath(filePath); + } + } + + @Override + public void setClosed(boolean closed) { + timeChunkMetadata.setClosed(closed); + for (IChunkMetadata chunkMetadata : valueChunkMetadataList) { + chunkMetadata.setClosed(closed); + } + } + + @Override + public TSDataType getDataType() { + return timeChunkMetadata.getDataType(); + } + + @Override + public String getMeasurementUid() { + return timeChunkMetadata.getMeasurementUid(); + } + + @Override + public void insertIntoSortedDeletions(long startTime, long endTime) { + timeChunkMetadata.insertIntoSortedDeletions(startTime, endTime); + } + + @Override + public List<TimeRange> getDeleteIntervalList() { + return timeChunkMetadata.getDeleteIntervalList(); + } + + public Chunk getTimeChunk() throws IOException { + return timeChunkMetadata.getChunkLoader().loadChunk((ChunkMetadata) timeChunkMetadata); + } + + public List<Chunk> getValueChunkList() throws IOException { + List<Chunk> valueChunkList = new ArrayList<>(); + for (IChunkMetadata chunkMetadata : valueChunkMetadataList) { + valueChunkList.add(chunkMetadata.getChunkLoader().loadChunk((ChunkMetadata) chunkMetadata)); + } + return valueChunkList; } } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java index 49a44aa..82aad19 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java @@ -18,6 +18,7 @@ */ package org.apache.iotdb.tsfile.file.metadata; +import java.util.ArrayList; import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics; import java.io.IOException; @@ -25,8 +26,16 @@ import java.util.List; public class VectorTimeSeriesMetadata implements ITimeSeriesMetadata { - private TimeseriesMetadata timeseriesMetadata; - private List<TimeseriesMetadata> valueTimeseriesMetadataList; + private final TimeseriesMetadata timeseriesMetadata; + private final List<TimeseriesMetadata> valueTimeseriesMetadataList; + + + public VectorTimeSeriesMetadata( + TimeseriesMetadata timeseriesMetadata, + List<TimeseriesMetadata> valueTimeseriesMetadataList) { + this.timeseriesMetadata = timeseriesMetadata; + this.valueTimeseriesMetadataList = valueTimeseriesMetadataList; + } @Override public Statistics getStatistics() { @@ -55,7 +64,27 @@ public class VectorTimeSeriesMetadata implements ITimeSeriesMetadata { @Override public List<IChunkMetadata> loadChunkMetadataList() throws IOException { - List<ChunkMetadata> timeChunkMetadata = timeseriesMetadata.loadChunkMetadataList(); + List<IChunkMetadata> timeChunkMetadata = timeseriesMetadata.loadChunkMetadataList(); + List<List<IChunkMetadata>> valueChunkMetadataList = new ArrayList<>(); + for (TimeseriesMetadata metadata : valueTimeseriesMetadataList) { + valueChunkMetadataList.add(metadata.loadChunkMetadataList()); + } + + List<IChunkMetadata> res = new ArrayList<>(); + + for (int i = 0; i < timeChunkMetadata.size(); i++) { + List<IChunkMetadata> chunkMetadataList = new ArrayList<>(); + for (List<IChunkMetadata> chunkMetadata : valueChunkMetadataList) { + chunkMetadataList.add(chunkMetadata.get(i)); + } + res.add(new VectorChunkMetadata(timeChunkMetadata.get(i), chunkMetadataList)); + } + + return res; + } + + @Override + public List<IChunkMetadata> getChunkMetadataList() { return null; } } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java index 256288f..434d10b 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java @@ -18,6 +18,27 @@ */ package org.apache.iotdb.tsfile.read; +import java.io.File; +import java.io.IOException; +import java.nio.BufferOverflowException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Queue; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.stream.Collectors; import org.apache.iotdb.tsfile.common.conf.TSFileConfig; import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor; import org.apache.iotdb.tsfile.compress.IUnCompressor; @@ -29,6 +50,7 @@ import org.apache.iotdb.tsfile.file.header.ChunkHeader; import org.apache.iotdb.tsfile.file.header.PageHeader; import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata; import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.MetadataIndexEntry; import org.apache.iotdb.tsfile.file.metadata.MetadataIndexNode; import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; @@ -49,32 +71,9 @@ import org.apache.iotdb.tsfile.utils.BloomFilter; import org.apache.iotdb.tsfile.utils.Pair; import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils; import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.nio.BufferOverflowException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Queue; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.stream.Collectors; - public class TsFileSequenceReader implements AutoCloseable { private static final Logger logger = LoggerFactory.getLogger(TsFileSequenceReader.class); @@ -539,14 +538,14 @@ public class TsFileSequenceReader implements AutoCloseable { * @return measurement -> ChunkMetadata list * @throws IOException io error */ - public Map<String, List<ChunkMetadata>> readChunkMetadataInDevice(String device) + public Map<String, List<IChunkMetadata>> readChunkMetadataInDevice(String device) throws IOException { readFileMetadata(); List<TimeseriesMetadata> timeseriesMetadataMap = getDeviceTimeseriesMetadata(device); if (timeseriesMetadataMap.isEmpty()) { return new HashMap<>(); } - Map<String, List<ChunkMetadata>> seriesMetadata = new HashMap<>(); + Map<String, List<IChunkMetadata>> seriesMetadata = new HashMap<>(); for (TimeseriesMetadata timeseriesMetadata : timeseriesMetadataMap) { seriesMetadata.put( timeseriesMetadata.getMeasurementId(), timeseriesMetadata.getChunkMetadataList()); @@ -1144,13 +1143,13 @@ public class TsFileSequenceReader implements AutoCloseable { * @param path timeseries path * @return List of ChunkMetaData */ - public List<ChunkMetadata> getChunkMetadataList(Path path) throws IOException { + public List<IChunkMetadata> getChunkMetadataList(Path path) throws IOException { TimeseriesMetadata timeseriesMetaData = readTimeseriesMetadata(path); if (timeseriesMetaData == null) { return Collections.emptyList(); } - List<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetaData); - chunkMetadataList.sort(Comparator.comparingLong(ChunkMetadata::getStartTime)); + List<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetaData); + chunkMetadataList.sort(Comparator.comparingLong(IChunkMetadata::getStartTime)); return chunkMetadataList; } @@ -1159,7 +1158,7 @@ public class TsFileSequenceReader implements AutoCloseable { * * @return List of ChunkMetaData */ - public List<ChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData) + public List<IChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData) throws IOException { return timeseriesMetaData.getChunkMetadataList(); } @@ -1203,7 +1202,7 @@ public class TsFileSequenceReader implements AutoCloseable { public List<String> getDeviceNameInRange(long start, long end) throws IOException { List<String> res = new ArrayList<>(); for (String device : getAllDevices()) { - Map<String, List<ChunkMetadata>> seriesMetadataMap = readChunkMetadataInDevice(device); + Map<String, List<IChunkMetadata>> seriesMetadataMap = readChunkMetadataInDevice(device); if (hasDataInPartition(seriesMetadataMap, start, end)) { res.add(device); } @@ -1219,9 +1218,9 @@ public class TsFileSequenceReader implements AutoCloseable { * @param end the end position of the space partition */ private boolean hasDataInPartition( - Map<String, List<ChunkMetadata>> seriesMetadataMap, long start, long end) { - for (List<ChunkMetadata> chunkMetadataList : seriesMetadataMap.values()) { - for (ChunkMetadata chunkMetadata : chunkMetadataList) { + Map<String, List<IChunkMetadata>> seriesMetadataMap, long start, long end) { + for (List<IChunkMetadata> chunkMetadataList : seriesMetadataMap.values()) { + for (IChunkMetadata chunkMetadata : chunkMetadataList) { LocateStatus location = MetadataQuerierByFileImpl.checkLocateStatus(chunkMetadata, start, end); if (location == LocateStatus.in) { @@ -1254,7 +1253,7 @@ public class TsFileSequenceReader implements AutoCloseable { return maxPlanIndex; } - public Iterator<Map<String, List<ChunkMetadata>>> getMeasurementChunkMetadataListMapIterator( + public Iterator<Map<String, List<IChunkMetadata>>> getMeasurementChunkMetadataListMapIterator( String device) throws IOException { readFileMetadata(); @@ -1263,7 +1262,7 @@ public class TsFileSequenceReader implements AutoCloseable { getMetadataAndEndOffset(metadataIndexNode, device, true, true); if (metadataIndexPair == null) { - return new Iterator<Map<String, List<ChunkMetadata>>>() { + return new Iterator<Map<String, List<IChunkMetadata>>>() { @Override public boolean hasNext() { @@ -1271,7 +1270,7 @@ public class TsFileSequenceReader implements AutoCloseable { } @Override - public Map<String, List<ChunkMetadata>> next() { + public Map<String, List<IChunkMetadata>> next() { throw new NoSuchElementException(); } }; @@ -1281,7 +1280,7 @@ public class TsFileSequenceReader implements AutoCloseable { ByteBuffer buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right); collectEachLeafMeasurementNodeOffsetRange(buffer, queue); - return new Iterator<Map<String, List<ChunkMetadata>>>() { + return new Iterator<Map<String, List<IChunkMetadata>>>() { @Override public boolean hasNext() { @@ -1289,12 +1288,12 @@ public class TsFileSequenceReader implements AutoCloseable { } @Override - public Map<String, List<ChunkMetadata>> next() { + public Map<String, List<IChunkMetadata>> next() { if (!hasNext()) { throw new NoSuchElementException(); } Pair<Long, Long> startEndPair = queue.remove(); - Map<String, List<ChunkMetadata>> measurementChunkMetadataList = new HashMap<>(); + Map<String, List<IChunkMetadata>> measurementChunkMetadataList = new HashMap<>(); try { List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>(); ByteBuffer nextBuffer = readData(startEndPair.left, startEndPair.right); diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java index f02f9e3..7268b12 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java @@ -18,15 +18,14 @@ */ package org.apache.iotdb.tsfile.read.controller; -import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; -import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; - import java.io.IOException; import java.util.List; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata; public interface IChunkMetadataLoader { /** read all chunk metadata of one time series in one file. */ - List<ChunkMetadata> loadChunkMetadataList(TimeseriesMetadata timeseriesMetadata) + List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeseriesMetadata) throws IOException; } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java index 704aa11..5ce61bb 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java @@ -18,22 +18,21 @@ */ package org.apache.iotdb.tsfile.read.controller; +import java.io.IOException; +import java.util.List; +import java.util.Map; import org.apache.iotdb.tsfile.exception.write.NoMeasurementException; -import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.read.common.Path; import org.apache.iotdb.tsfile.read.common.TimeRange; -import java.io.IOException; -import java.util.List; -import java.util.Map; - public interface IMetadataQuerier { - List<ChunkMetadata> getChunkMetaDataList(Path path) throws IOException; + List<IChunkMetadata> getChunkMetaDataList(Path path) throws IOException; - Map<Path, List<ChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException; + Map<Path, List<IChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException; TsFileMetadata getWholeFileMetadata(); diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java index dbe7f7b..3204c2f 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java @@ -18,16 +18,6 @@ */ package org.apache.iotdb.tsfile.read.controller; -import org.apache.iotdb.tsfile.common.cache.LRUCache; -import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; -import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; -import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; -import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; -import org.apache.iotdb.tsfile.read.TsFileSequenceReader; -import org.apache.iotdb.tsfile.read.TsFileSequenceReader.LocateStatus; -import org.apache.iotdb.tsfile.read.common.Path; -import org.apache.iotdb.tsfile.read.common.TimeRange; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -39,6 +29,15 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; +import org.apache.iotdb.tsfile.common.cache.LRUCache; +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata; +import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; +import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; +import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; +import org.apache.iotdb.tsfile.read.TsFileSequenceReader; +import org.apache.iotdb.tsfile.read.TsFileSequenceReader.LocateStatus; +import org.apache.iotdb.tsfile.read.common.Path; +import org.apache.iotdb.tsfile.read.common.TimeRange; public class MetadataQuerierByFileImpl implements IMetadataQuerier { @@ -47,7 +46,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { private TsFileMetadata fileMetaData; - private LRUCache<Path, List<ChunkMetadata>> chunkMetaDataCache; + private LRUCache<Path, List<IChunkMetadata>> chunkMetaDataCache; private TsFileSequenceReader tsFileReader; @@ -56,22 +55,22 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { this.tsFileReader = tsFileReader; this.fileMetaData = tsFileReader.readFileMetadata(); chunkMetaDataCache = - new LRUCache<Path, List<ChunkMetadata>>(CACHED_ENTRY_NUMBER) { + new LRUCache<Path, List<IChunkMetadata>>(CACHED_ENTRY_NUMBER) { @Override - public List<ChunkMetadata> loadObjectByKey(Path key) throws IOException { + public List<IChunkMetadata> loadObjectByKey(Path key) throws IOException { return loadChunkMetadata(key); } }; } @Override - public List<ChunkMetadata> getChunkMetaDataList(Path path) throws IOException { + public List<IChunkMetadata> getChunkMetaDataList(Path path) throws IOException { return chunkMetaDataCache.get(path); } @Override - public Map<Path, List<ChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException { - Map<Path, List<ChunkMetadata>> chunkMetaDatas = new HashMap<>(); + public Map<Path, List<IChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException { + Map<Path, List<IChunkMetadata>> chunkMetaDatas = new HashMap<>(); for (Path path : paths) { if (!chunkMetaDatas.containsKey(path)) { chunkMetaDatas.put(path, new ArrayList<>()); @@ -98,7 +97,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { deviceMeasurementsMap.get(path.getDevice()).add(path.getMeasurement()); } - Map<Path, List<ChunkMetadata>> tempChunkMetaDatas = new HashMap<>(); + Map<Path, List<IChunkMetadata>> tempChunkMetaDatas = new HashMap<>(); int count = 0; boolean enough = false; @@ -118,12 +117,12 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { List<TimeseriesMetadata> timeseriesMetaDataList = tsFileReader.readTimeseriesMetadata(selectedDevice, selectedMeasurements); - List<ChunkMetadata> chunkMetadataList = new ArrayList<>(); + List<IChunkMetadata> chunkMetadataList = new ArrayList<>(); for (TimeseriesMetadata timeseriesMetadata : timeseriesMetaDataList) { chunkMetadataList.addAll(tsFileReader.readChunkMetaDataList(timeseriesMetadata)); } // d1 - for (ChunkMetadata chunkMetaData : chunkMetadataList) { + for (IChunkMetadata chunkMetaData : chunkMetadataList) { String currentMeasurement = chunkMetaData.getMeasurementUid(); // s1 @@ -148,7 +147,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { } } - for (Map.Entry<Path, List<ChunkMetadata>> entry : tempChunkMetaDatas.entrySet()) { + for (Map.Entry<Path, List<IChunkMetadata>> entry : tempChunkMetaDatas.entrySet()) { chunkMetaDataCache.put(entry.getKey(), entry.getValue()); } } @@ -162,7 +161,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { return tsFileReader.getChunkMetadataList(path).get(0).getDataType(); } - private List<ChunkMetadata> loadChunkMetadata(Path path) throws IOException { + private List<IChunkMetadata> loadChunkMetadata(Path path) throws IOException { return tsFileReader.getChunkMetadataList(path); } @@ -193,16 +192,16 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { Set<String> selectedMeasurements = deviceMeasurements.getValue(); // measurement -> ChunkMetadata list - Map<String, List<ChunkMetadata>> seriesMetadatas = + Map<String, List<IChunkMetadata>> seriesMetadatas = tsFileReader.readChunkMetadataInDevice(selectedDevice); - for (Entry<String, List<ChunkMetadata>> seriesMetadata : seriesMetadatas.entrySet()) { + for (Entry<String, List<IChunkMetadata>> seriesMetadata : seriesMetadatas.entrySet()) { if (!selectedMeasurements.contains(seriesMetadata.getKey())) { continue; } - for (ChunkMetadata chunkMetadata : seriesMetadata.getValue()) { + for (IChunkMetadata chunkMetadata : seriesMetadata.getValue()) { LocateStatus location = checkLocateStatus(chunkMetadata, spacePartitionStartPos, spacePartitionEndPos); if (location == LocateStatus.after) { @@ -250,7 +249,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier { * @return LocateStatus */ public static LocateStatus checkLocateStatus( - ChunkMetadata chunkMetaData, long spacePartitionStartPos, long spacePartitionEndPos) { + IChunkMetadata chunkMetaData, long spacePartitionStartPos, long spacePartitionEndPos) { long startOffsetOfChunk = chunkMetaData.getOffsetOfChunkHeader(); if (spacePartitionStartPos <= startOffsetOfChunk && startOffsetOfChunk < spacePartitionEndPos) { return LocateStatus.in; diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java index 9247a72..cf10567 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java @@ -18,11 +18,24 @@ */ package org.apache.iotdb.tsfile.v2.read; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import java.util.stream.Collectors; import org.apache.iotdb.tsfile.common.conf.TSFileConfig; import org.apache.iotdb.tsfile.file.header.ChunkGroupHeader; 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.file.metadata.IChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.MetadataIndexEntry; import org.apache.iotdb.tsfile.file.metadata.MetadataIndexNode; import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; @@ -43,19 +56,6 @@ import org.apache.iotdb.tsfile.v2.file.metadata.MetadataIndexNodeV2; import org.apache.iotdb.tsfile.v2.file.metadata.TimeseriesMetadataV2; import org.apache.iotdb.tsfile.v2.file.metadata.TsFileMetadataV2; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; -import java.util.stream.Collectors; - public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements AutoCloseable { private List<Pair<Long, Long>> versionInfo; @@ -182,7 +182,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right); while (buffer.hasRemaining()) { TimeseriesMetadata timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer); - ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); + ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); timeseriesMetadata.setChunkMetadataList(chunkMetadataList); timeseriesMetadataList.add(timeseriesMetadata); } @@ -222,7 +222,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A while (buffer.hasRemaining()) { TimeseriesMetadata timeseriesMetadata; timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer); - ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); + ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); timeseriesMetadata.setChunkMetadataList(chunkMetadataList); if (allSensors.contains(timeseriesMetadata.getMeasurementId())) { timeseriesMetadataList.add(timeseriesMetadata); @@ -271,7 +271,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A measurementMetadataIndexPair.left.getOffset(), measurementMetadataIndexPair.right); while (buffer.hasRemaining()) { TimeseriesMetadata timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer); - ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); + ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); timeseriesMetadata.setChunkMetadataList(chunkMetadataList); timeseriesMetadataList.add(timeseriesMetadata); } @@ -338,7 +338,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A * @throws IOException io error */ @Override - public Map<String, List<ChunkMetadata>> readChunkMetadataInDevice(String device) + public Map<String, List<IChunkMetadata>> readChunkMetadataInDevice(String device) throws IOException { if (tsFileMetaData == null) { readFileMetadata(); @@ -355,7 +355,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A } // read buffer of all ChunkMetadatas of this device ByteBuffer buffer = readData(start, size); - Map<String, List<ChunkMetadata>> seriesMetadata = new HashMap<>(); + Map<String, List<IChunkMetadata>> seriesMetadata = new HashMap<>(); while (buffer.hasRemaining()) { ChunkMetadata chunkMetadata = ChunkMetadataV2.deserializeFrom(buffer); seriesMetadata @@ -363,7 +363,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A .add(chunkMetadata); } // set version in ChunkMetadata - for (Entry<String, List<ChunkMetadata>> entry : seriesMetadata.entrySet()) { + for (Entry<String, List<IChunkMetadata>> entry : seriesMetadata.entrySet()) { applyVersion(entry.getValue()); } return seriesMetadata; @@ -410,7 +410,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>(); while (buffer.hasRemaining()) { TimeseriesMetadata timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer); - ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); + ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata); timeseriesMetadata.setChunkMetadataList(chunkMetadataList); timeseriesMetadataList.add(timeseriesMetadata); } @@ -584,10 +584,10 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A * * @return List of ChunkMetaData */ - public ArrayList<ChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData) + public ArrayList<IChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData) throws IOException { readFileMetadata(); - ArrayList<ChunkMetadata> chunkMetadataList = new ArrayList<>(); + ArrayList<IChunkMetadata> chunkMetadataList = new ArrayList<>(); long startOffsetOfChunkMetadataList = timeseriesMetaData.getOffsetOfChunkMetaDataList(); int dataSizeOfChunkMetadataList = timeseriesMetaData.getDataSizeOfChunkMetaDataList(); @@ -602,12 +602,12 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A return chunkMetadataList; } - private void applyVersion(List<ChunkMetadata> chunkMetadataList) { + private void applyVersion(List<IChunkMetadata> chunkMetadataList) { if (versionInfo == null || versionInfo.isEmpty()) { return; } int versionIndex = 0; - for (ChunkMetadata chunkMetadata : chunkMetadataList) { + for (IChunkMetadata chunkMetadata : chunkMetadataList) { while (chunkMetadata.getOffsetOfChunkHeader() >= versionInfo.get(versionIndex).left) { versionIndex++;
