This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch tsFile_v4
in repository https://gitbox.apache.org/repos/asf/tsfile.git
The following commit(s) were added to refs/heads/tsFile_v4 by this push:
new ed0630b6 add more tests
ed0630b6 is described below
commit ed0630b61a72c6874cff1371740d2f496a3a5a1f
Author: jt2594838 <[email protected]>
AuthorDate: Fri Apr 12 16:26:45 2024 +0800
add more tests
---
.../apache/tsfile/file/metadata/ChunkMetadata.java | 2 +
.../read/controller/MetadataQuerierByFileImpl.java | 17 +-
.../apache/tsfile/write/TableViewWriteTest.java | 182 +++++++++++++++++++++
3 files changed, 188 insertions(+), 13 deletions(-)
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/ChunkMetadata.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/ChunkMetadata.java
index 62d6eede..6a766c8a 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/ChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/ChunkMetadata.java
@@ -108,6 +108,8 @@ public class ChunkMetadata implements IChunkMetadata {
this.tsDataType = tsDataType;
this.offsetOfChunkHeader = fileOffset;
this.statistics = statistics;
+ this.encoding = encoding;
+ this.compressionType = compressionType;
}
// won't clone deleteIntervalList & modified
diff --git
a/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
b/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
index c38e8505..af3039ba 100644
---
a/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
+++
b/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
@@ -56,8 +56,7 @@ public class MetadataQuerierByFileImpl implements
IMetadataQuerier {
private TsFileMetadata fileMetaData;
- // TimeseriesPath -> List<IChunkMetadata>
- private LRUCache<Path, List<IChunkMetadata>> chunkMetaDataCache;
+ // (deviceId, measurementId) -> List<IChunkMetadata>
private LRUCache<Pair<IDeviceID, String>, List<IChunkMetadata>>
deviceIdChunkMetadataCache;
private TsFileSequenceReader tsFileReader;
@@ -66,13 +65,6 @@ public class MetadataQuerierByFileImpl implements
IMetadataQuerier {
public MetadataQuerierByFileImpl(TsFileSequenceReader tsFileReader) throws
IOException {
this.tsFileReader = tsFileReader;
this.fileMetaData = tsFileReader.readFileMetadata();
- chunkMetaDataCache =
- new LRUCache<Path, List<IChunkMetadata>>(CACHED_ENTRY_NUMBER) {
- @Override
- public List<IChunkMetadata> loadObjectByKey(Path key) throws
IOException {
- return loadChunkMetadata(key);
- }
- };
deviceIdChunkMetadataCache =
new LRUCache<Pair<IDeviceID, String>,
List<IChunkMetadata>>(CACHED_ENTRY_NUMBER) {
@Override
@@ -85,7 +77,7 @@ public class MetadataQuerierByFileImpl implements
IMetadataQuerier {
@Override
public List<IChunkMetadata> getChunkMetaDataList(Path timeseriesPath) throws
IOException {
- return new ArrayList<>(chunkMetaDataCache.get(timeseriesPath));
+ return new ArrayList<>(deviceIdChunkMetadataCache.get(new
Pair<>(timeseriesPath.getIDeviceID(), timeseriesPath.getMeasurement())));
}
public List<List<IChunkMetadata>> getChunkMetadataLists(
@@ -173,8 +165,7 @@ public class MetadataQuerierByFileImpl implements
IMetadataQuerier {
} else {
measurementId = ((TimeseriesMetadata)
timeseriesMetadata).getMeasurementId();
}
- this.chunkMetaDataCache.put(
- new Path(selectedDevice, measurementId, true), chunkMetadataList);
+ this.deviceIdChunkMetadataCache.put(new Pair<>(selectedDevice,
measurementId), chunkMetadataList);
count += chunkMetadataList.size();
if (count == CACHED_ENTRY_NUMBER) {
enough = true;
@@ -298,7 +289,7 @@ public class MetadataQuerierByFileImpl implements
IMetadataQuerier {
@Override
public void clear() {
- chunkMetaDataCache.clear();
+ deviceIdChunkMetadataCache.clear();
}
@Override
diff --git
a/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
b/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
index a9133af1..d187e8a2 100644
--- a/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
@@ -22,19 +22,29 @@ package org.apache.tsfile.write;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.exception.read.ReadProcessException;
import org.apache.tsfile.exception.write.WriteProcessException;
+import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.file.metadata.IDeviceID.Factory;
import org.apache.tsfile.file.metadata.TableSchema;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.read.common.RowRecord;
import org.apache.tsfile.read.common.block.TsBlock;
import org.apache.tsfile.read.controller.CachedChunkLoaderImpl;
import org.apache.tsfile.read.controller.MetadataQuerierByFileImpl;
+import org.apache.tsfile.read.expression.QueryExpression;
+import org.apache.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.tsfile.read.query.executor.QueryExecutor;
import org.apache.tsfile.read.query.executor.TableQueryExecutor;
import
org.apache.tsfile.read.query.executor.TableQueryExecutor.TableQueryOrdering;
+import org.apache.tsfile.read.query.executor.TsFileExecutor;
import org.apache.tsfile.read.reader.block.TsBlockReader;
import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.write.record.TSRecord;
import org.apache.tsfile.write.record.Tablet;
import org.apache.tsfile.write.record.Tablet.ColumnType;
+import org.apache.tsfile.write.record.datapoint.LongDataPoint;
import org.apache.tsfile.write.schema.MeasurementSchema;
import org.apache.commons.io.FileUtils;
@@ -101,6 +111,178 @@ public class TableViewWriteTest {
assertEquals(100, cnt);
}
+ @Test
+ public void testWriteMultipleTables() throws Exception {
+ final File testFile = new File(testDir, "testFile");
+ TsFileWriter writer = new TsFileWriter(testFile);
+ List<TableSchema> tableSchemas = new ArrayList<>();
+
+ int tableNum = 10;
+ for (int i = 0; i < tableNum; i++) {
+ final TableSchema tableSchema = genTableSchema(i);
+ tableSchemas.add(tableSchema);
+ writer.registerTableSchema(tableSchema);
+ }
+
+ for (int i = 0; i < tableNum; i++) {
+ writer.writeTable(genTablet(tableSchemas.get(i), 0, 100));
+ }
+ writer.close();
+
+ TsFileSequenceReader sequenceReader = new
TsFileSequenceReader(testFile.getAbsolutePath());
+ TableQueryExecutor tableQueryExecutor =
+ new TableQueryExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader),
+ TableQueryOrdering.DEVICE);
+
+ final List<String> columns =
+ testTableSchema.getColumnSchemas().stream()
+ .map(MeasurementSchema::getMeasurementId)
+ .collect(Collectors.toList());
+
+ for (int i = 0; i < tableNum; i++) {
+ int cnt;
+ try (TsBlockReader reader =
tableQueryExecutor.query(tableSchemas.get(i).getTableName(),
+ columns, null, null, null)) {
+ assertTrue(reader.hasNext());
+ cnt = 0;
+ while (reader.hasNext()) {
+ final TsBlock result = reader.next();
+ cnt += result.getPositionCount();
+ }
+ }
+ assertEquals(100, cnt);
+ }
+ }
+
+ @Test
+ public void testHybridWrite() throws Exception {
+ final File testFile = new File(testDir, "testFile");
+ TsFileWriter writer = new TsFileWriter(testFile);
+ // table-view registration
+ writer.registerTableSchema(testTableSchema);
+ // tree-view registration
+ final IDeviceID deviceID = Factory.DEFAULT_FACTORY.create("root.a.b.c.d1");
+ List<MeasurementSchema> treeSchemas = new ArrayList<>();
+ for (int i = 0; i < measurementSchemaNum; i++) {
+ final MeasurementSchema measurementSchema = new MeasurementSchema("s" +
i, TSDataType.INT64,
+ TSEncoding.PLAIN,
+ CompressionType.UNCOMPRESSED);
+ treeSchemas.add(measurementSchema);
+ writer.registerTimeseries(deviceID, measurementSchema);
+ }
+
+ // table-view write
+ final Tablet tablet = genTablet(testTableSchema, 0, 100);
+ writer.writeTable(tablet);
+ // tree-view write
+ for (int i = 0; i < 50; i++) {
+ final TSRecord tsRecord = new TSRecord(i, deviceID);
+ for (int j = 0; j < measurementSchemaNum; j++) {
+ tsRecord.addTuple(new LongDataPoint("s" + j, i));
+ }
+ writer.write(tsRecord);
+ }
+ writer.close();
+
+ // table-view read table-view
+ int cnt;
+ try (TsFileSequenceReader sequenceReader = new TsFileSequenceReader(
+ testFile.getAbsolutePath())) {
+ TableQueryExecutor tableQueryExecutor =
+ new TableQueryExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader),
+ TableQueryOrdering.DEVICE);
+
+ List<String> columns =
+ testTableSchema.getColumnSchemas().stream()
+ .map(MeasurementSchema::getMeasurementId)
+ .collect(Collectors.toList());
+ TsBlockReader reader =
+ tableQueryExecutor.query(testTableSchema.getTableName(), columns,
null, null, null);
+ assertTrue(reader.hasNext());
+ cnt = 0;
+ while (reader.hasNext()) {
+ final TsBlock result = reader.next();
+ cnt += result.getPositionCount();
+ }
+ assertEquals(100, cnt);
+ }
+
+ // tree-view read tree-view
+ try (TsFileSequenceReader sequenceReader = new TsFileSequenceReader(
+ testFile.getAbsolutePath())) {
+ QueryExecutor queryExecutor = new TsFileExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader));
+
+ List<Path> selectedSeries = new ArrayList<>();
+ for (int i = 0; i < measurementSchemaNum; i++) {
+ selectedSeries.add(new Path(deviceID, "s" + i, false));
+ }
+ final QueryExpression queryExpression =
QueryExpression.create(selectedSeries, null);
+ final QueryDataSet queryDataSet = queryExecutor.execute(queryExpression);
+ cnt = 0;
+ while (queryDataSet.hasNext()) {
+ queryDataSet.next();
+ cnt++;
+ }
+ assertEquals(50, cnt);
+ }
+
+ // table-view read tree-view
+ try (TsFileSequenceReader sequenceReader = new TsFileSequenceReader(
+ testFile.getAbsolutePath())) {
+ TableQueryExecutor tableQueryExecutor =
+ new TableQueryExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader),
+ TableQueryOrdering.DEVICE);
+
+ List<String> columns =
+ treeSchemas.stream()
+ .map(MeasurementSchema::getMeasurementId)
+ .collect(Collectors.toList());
+ TsBlockReader reader =
+ tableQueryExecutor.query(deviceID.getTableName(), columns, null,
null, null);
+ assertTrue(reader.hasNext());
+ cnt = 0;
+ while (reader.hasNext()) {
+ final TsBlock result = reader.next();
+ cnt += result.getPositionCount();
+ }
+ assertEquals(50, cnt);
+ }
+
+ // tree-view read table-view
+ try (TsFileSequenceReader sequenceReader = new TsFileSequenceReader(
+ testFile.getAbsolutePath())) {
+ QueryExecutor queryExecutor = new TsFileExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader));
+
+ List<Path> selectedSeries = new ArrayList<>();
+ for (int i = 0; i < 100; i++) {
+ final IDeviceID tabletDeviceID = tablet.getDeviceID(i);
+ for (int j = 0; j < measurementSchemaNum; j++) {
+ selectedSeries.add(new Path(tabletDeviceID, "s" + j, false));
+ }
+ }
+
+ final QueryExpression queryExpression =
QueryExpression.create(selectedSeries, null);
+ final QueryDataSet queryDataSet = queryExecutor.execute(queryExpression);
+ cnt = 0;
+ List<RowRecord> rowRecords = new ArrayList<>();
+ while (queryDataSet.hasNext()) {
+ rowRecords.add(queryDataSet.next());
+ cnt++;
+ }
+ assertEquals(100, cnt);
+ }
+ }
+
private Tablet genTablet(TableSchema tableSchema, int offset, int num) {
Tablet tablet = new Tablet(tableSchema.getTableName(),
tableSchema.getColumnSchemas(),
tableSchema.getColumnTypes());