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 3286aa7b Factorize IDeviceId
3286aa7b is described below
commit 3286aa7b38514d466db7859a110a83e0657cad27
Author: jt2594838 <[email protected]>
AuthorDate: Fri Apr 12 10:44:05 2024 +0800
Factorize IDeviceId
---
.../CompatibilityUtils.java | 43 ++++++-
.../tsfile/file/header/ChunkGroupHeader.java | 20 +--
.../file/metadata/DeviceMetadataIndexEntry.java | 25 +++-
.../org/apache/tsfile/file/metadata/IDeviceID.java | 31 ++++-
.../apache/tsfile/file/metadata/PlainDeviceID.java | 30 ++++-
.../tsfile/file/metadata/StringArrayDeviceID.java | 68 +++++++++-
.../apache/tsfile/file/metadata/TableSchema.java | 4 +
.../java/org/apache/tsfile/read/common/Path.java | 3 +-
.../org/apache/tsfile/utils/ReadWriteIOUtils.java | 4 +-
.../java/org/apache/tsfile/write/TsFileWriter.java | 140 ++++++++------------
.../org/apache/tsfile/write/schema/Schema.java | 33 +++--
.../apache/tsfile/file/metadata/utils/Utils.java | 8 +-
.../tsfile/write/MetadataIndexConstructorTest.java | 2 +-
.../apache/tsfile/write/TableViewWriteTest.java | 141 +++++++++++++++++++++
.../apache/tsfile/write/TsFileIOWriterTest.java | 2 +-
15 files changed, 422 insertions(+), 132 deletions(-)
diff --git
a/tsfile/src/main/java/org/apache/tsfile/utils/CompatibilityUtils.java
b/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
similarity index 54%
rename from tsfile/src/main/java/org/apache/tsfile/utils/CompatibilityUtils.java
rename to
tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
index 4f8bcb99..0933c1ec 100644
--- a/tsfile/src/main/java/org/apache/tsfile/utils/CompatibilityUtils.java
+++
b/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
@@ -17,15 +17,29 @@
* under the License.
*/
-package org.apache.tsfile.utils;
+package org.apache.tsfile.compatibility;
+import org.apache.tsfile.file.metadata.DeviceMetadataIndexEntry;
+import org.apache.tsfile.file.metadata.DeviceMetadataIndexEntry.Deserializer;
+import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.MetadataIndexNode;
+import org.apache.tsfile.file.metadata.PlainDeviceID;
import org.apache.tsfile.file.metadata.TsFileMetadata;
+import org.apache.tsfile.utils.BloomFilter;
+import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
+import org.apache.tsfile.utils.ReadWriteIOUtils;
+import java.io.IOException;
+import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.Collections;
public class CompatibilityUtils {
+
+ private CompatibilityUtils() {
+ // util class
+ }
+
public static TsFileMetadata deserializeTsFileMetadataFromV3(ByteBuffer
buffer) {
TsFileMetadata fileMetaData = new TsFileMetadata();
@@ -48,4 +62,31 @@ public class CompatibilityUtils {
return fileMetaData;
}
+
+ public static DeviceMetadataIndexEntry.Deserializer
v3DeviceMetadataIndexEntryDeserializer =
+ new Deserializer() {
+ @Override
+ public DeviceMetadataIndexEntry deserializeFrom(ByteBuffer buffer) {
+ return deserializeFromV3(buffer);
+ }
+
+ @Override
+ public DeviceMetadataIndexEntry deserializeFrom(InputStream
inputStream)
+ throws IOException {
+ return deserializeFromV3(inputStream);
+ }
+ };
+
+ public static DeviceMetadataIndexEntry deserializeFromV3(ByteBuffer buffer) {
+ IDeviceID device = PlainDeviceID.DESERIALIZER.deserializeFrom(buffer);
+ long offset = ReadWriteIOUtils.readLong(buffer);
+ return new DeviceMetadataIndexEntry(device, offset);
+ }
+
+ public static DeviceMetadataIndexEntry deserializeFromV3(InputStream
inputStream)
+ throws IOException {
+ IDeviceID device = PlainDeviceID.DESERIALIZER.deserializeFrom(inputStream);
+ long offset = ReadWriteIOUtils.readLong(inputStream);
+ return new DeviceMetadataIndexEntry(device, offset);
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
b/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
index 8e327af6..05c98a26 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
@@ -19,7 +19,6 @@
package org.apache.tsfile.file.header;
-import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.file.MetaMarker;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.PlainDeviceID;
@@ -56,8 +55,7 @@ public class ChunkGroupHeader {
private int getSerializedSize(IDeviceID deviceID) {
// TODO: add an interface in IDeviceID
- int length =
- ((PlainDeviceID)
deviceID).toStringID().getBytes(TSFileConfig.STRING_CHARSET).length;
+ int length = deviceID.serializedSize();
return Byte.BYTES + ReadWriteForEncodingUtils.varIntSize(length) + length;
}
@@ -77,11 +75,8 @@ public class ChunkGroupHeader {
}
// TODO: add an interface in IDeviceID
- String deviceID = ReadWriteIOUtils.readVarIntString(inputStream);
- if (deviceID == null || deviceID.isEmpty()) {
- throw new IOException("DeviceId is empty");
- }
- return new ChunkGroupHeader(new PlainDeviceID(deviceID));
+ final IDeviceID deviceID =
IDeviceID.DEFAULT_DESERIALIZER.deserializeFrom(inputStream);
+ return new ChunkGroupHeader(deviceID);
}
/**
@@ -97,8 +92,13 @@ public class ChunkGroupHeader {
offsetVar++;
}
// TODO: add an interface in IDeviceID
- String deviceID = input.readVarIntString(offsetVar);
- return new ChunkGroupHeader(new PlainDeviceID(deviceID));
+ final InputStream inputStream = input.wrapAsInputStream();
+ final long skipped = inputStream.skip(offsetVar);
+ if (skipped != offsetVar) {
+ throw new IOException("Skipped " + skipped + " of " + offsetVar);
+ }
+ final IDeviceID deviceID =
IDeviceID.DEFAULT_DESERIALIZER.deserializeFrom(inputStream);
+ return new ChunkGroupHeader(deviceID);
}
public IDeviceID getDeviceID() {
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
index 9993cb7a..7d572d6a 100644
---
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
+++
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
@@ -28,6 +28,21 @@ import java.io.OutputStream;
import java.nio.ByteBuffer;
public class DeviceMetadataIndexEntry implements IMetadataIndexEntry {
+
+ public static final Deserializer DESERIALIZER =
+ new Deserializer() {
+ @Override
+ public DeviceMetadataIndexEntry deserializeFrom(ByteBuffer buffer) {
+ return DeviceMetadataIndexEntry.deserializeFrom(buffer);
+ }
+
+ @Override
+ public DeviceMetadataIndexEntry deserializeFrom(InputStream
inputStream)
+ throws IOException {
+ return DeviceMetadataIndexEntry.deserializeFrom(inputStream);
+ }
+ };
+
private IDeviceID deviceID;
private long offset;
@@ -73,14 +88,14 @@ public class DeviceMetadataIndexEntry implements
IMetadataIndexEntry {
}
public static DeviceMetadataIndexEntry deserializeFrom(ByteBuffer buffer) {
- IDeviceID device = IDeviceID.deserializeFrom(buffer);
+ IDeviceID device = IDeviceID.DEFAULT_DESERIALIZER.deserializeFrom(buffer);
long offset = ReadWriteIOUtils.readLong(buffer);
return new DeviceMetadataIndexEntry(device, offset);
}
public static DeviceMetadataIndexEntry deserializeFrom(InputStream
inputStream)
throws IOException {
- IDeviceID device = IDeviceID.deserializeFrom(inputStream);
+ IDeviceID device =
IDeviceID.DEFAULT_DESERIALIZER.deserializeFrom(inputStream);
long offset = ReadWriteIOUtils.readLong(inputStream);
return new DeviceMetadataIndexEntry(device, offset);
}
@@ -89,4 +104,10 @@ public class DeviceMetadataIndexEntry implements
IMetadataIndexEntry {
public String toString() {
return "<" + deviceID + "," + offset + ">";
}
+
+ public interface Deserializer {
+ DeviceMetadataIndexEntry deserializeFrom(ByteBuffer buffer);
+
+ DeviceMetadataIndexEntry deserializeFrom(InputStream inputStream) throws
IOException;
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/IDeviceID.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/IDeviceID.java
index 5fadc0ab..9e13b6da 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/IDeviceID.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/IDeviceID.java
@@ -20,8 +20,11 @@
package org.apache.tsfile.file.metadata;
import org.apache.tsfile.utils.Accountable;
-import org.apache.tsfile.utils.ReadWriteIOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -30,6 +33,10 @@ import java.nio.ByteBuffer;
/** Device id interface. */
public interface IDeviceID extends Comparable<IDeviceID>, Accountable {
+ Logger LOGGER = LoggerFactory.getLogger(IDeviceID.class);
+ Deserializer DEFAULT_DESERIALIZER = StringArrayDeviceID.DESERIALIZER;
+ Factory DEFAULT_FACTORY = StringArrayDeviceID.FACTORY;
+
int serialize(ByteBuffer byteBuffer);
int serialize(OutputStream outputStream) throws IOException;
@@ -59,11 +66,25 @@ public interface IDeviceID extends Comparable<IDeviceID>,
Accountable {
*/
Object segment(int i);
- static IDeviceID deserializeFrom(ByteBuffer byteBuffer) {
- return new PlainDeviceID(ReadWriteIOUtils.readVarIntString(byteBuffer));
+ default int serializedSize() {
+ LOGGER.debug(
+ "Using default inefficient implementation of serialized size by {}",
this.getClass());
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+ serialize(baos);
+ return baos.size();
+ } catch (IOException e) {
+ LOGGER.error("Failed to serialize device ID: {}", this, e);
+ return -1;
+ }
+ }
+
+ interface Deserializer {
+ IDeviceID deserializeFrom(ByteBuffer byteBuffer);
+
+ IDeviceID deserializeFrom(InputStream inputStream) throws IOException;
}
- static IDeviceID deserializeFrom(InputStream inputStream) throws IOException
{
- return new PlainDeviceID(ReadWriteIOUtils.readVarIntString(inputStream));
+ interface Factory {
+ IDeviceID create(String deviceIdString);
}
}
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
index f7bb0b84..a983b2f0 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
@@ -24,6 +24,7 @@ import org.apache.tsfile.utils.RamUsageEstimator;
import org.apache.tsfile.utils.ReadWriteIOUtils;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.Objects;
@@ -34,6 +35,27 @@ import static
org.apache.tsfile.utils.RamUsageEstimator.sizeOfCharArray;
/** Using device id path as id. */
public class PlainDeviceID implements IDeviceID {
+ public static final Deserializer DESERIALIZER =
+ new Deserializer() {
+ @Override
+ public IDeviceID deserializeFrom(ByteBuffer byteBuffer) {
+ return deserialize(byteBuffer);
+ }
+
+ @Override
+ public IDeviceID deserializeFrom(InputStream inputStream) throws
IOException {
+ return deserialize(inputStream);
+ }
+ };
+
+ public static final Factory FACTORY =
+ new Factory() {
+ @Override
+ public IDeviceID create(String deviceIdString) {
+ return new PlainDeviceID(deviceIdString);
+ }
+ };
+
// TODO: configurable but unchangeable
private static final int DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3;
private static final long INSTANCE_SIZE =
@@ -106,8 +128,12 @@ public class PlainDeviceID implements IDeviceID {
return size;
}
- public static PlainDeviceID deserialize(ByteBuffer byteBuffer) {
- return new PlainDeviceID(ReadWriteIOUtils.readString(byteBuffer));
+ public static IDeviceID deserialize(ByteBuffer byteBuffer) {
+ return new PlainDeviceID(ReadWriteIOUtils.readVarIntString(byteBuffer));
+ }
+
+ public static IDeviceID deserialize(InputStream inputStream) throws
IOException {
+ return new PlainDeviceID(ReadWriteIOUtils.readVarIntString(inputStream));
}
@Override
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
index 45b10610..40f16aff 100644
---
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
+++
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
@@ -19,6 +19,8 @@
package org.apache.tsfile.file.metadata;
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.common.constant.TsFileConstant;
import org.apache.tsfile.exception.TsFileRuntimeException;
import org.apache.tsfile.utils.RamUsageEstimator;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -26,13 +28,34 @@ import org.apache.tsfile.utils.WriteUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
import java.util.Objects;
public class StringArrayDeviceID implements IDeviceID {
+ public static final Deserializer DESERIALIZER =
+ new Deserializer() {
+ @Override
+ public IDeviceID deserializeFrom(ByteBuffer byteBuffer) {
+ return deserialize(byteBuffer);
+ }
+
+ @Override
+ public IDeviceID deserializeFrom(InputStream inputStream) throws
IOException {
+ return deserialize(inputStream);
+ }
+ };
+
+ public static final Factory FACTORY =
+ new Factory() {
+ @Override
+ public IDeviceID create(String deviceIdString) {
+ return new StringArrayDeviceID(deviceIdString);
+ }
+ };
+
private static final long INSTANCE_SIZE =
RamUsageEstimator.shallowSizeOfInstance(StringArrayDeviceID.class);
@@ -44,6 +67,10 @@ public class StringArrayDeviceID implements IDeviceID {
this.segments = segments;
}
+ public StringArrayDeviceID(String deviceIdString) {
+ this.segments =
deviceIdString.split(TsFileConstant.PATH_SEPARATER_NO_REGEX);
+ }
+
@Override
public int serialize(ByteBuffer byteBuffer) {
int cnt = 0;
@@ -64,12 +91,39 @@ public class StringArrayDeviceID implements IDeviceID {
return cnt;
}
+ public static StringArrayDeviceID deserialize(ByteBuffer byteBuffer) {
+ final int cnt = byteBuffer.getInt();
+ String[] segments = new String[cnt];
+ for (int i = 0; i < cnt; i++) {
+ final int stringSize = byteBuffer.getInt();
+ byte[] stringBytes = new byte[stringSize];
+ byteBuffer.get(stringBytes);
+ segments[i] = new String(stringBytes, TSFileConfig.STRING_CHARSET);
+ }
+ return new StringArrayDeviceID(segments);
+ }
+
+ public static StringArrayDeviceID deserialize(InputStream stream) throws
IOException {
+ final int cnt = ReadWriteIOUtils.readInt(stream);
+ String[] segments = new String[cnt];
+ for (int i = 0; i < cnt; i++) {
+ final int stringSize = ReadWriteIOUtils.readInt(stream);
+ byte[] stringBytes = new byte[stringSize];
+ final int readCnt = stream.read(stringBytes);
+ if (readCnt != stringSize) {
+ throw new IOException(String.format("Expected %d bytes but read %d",
stringSize, readCnt));
+ }
+ segments[i] = new String(stringBytes, TSFileConfig.STRING_CHARSET);
+ }
+ return new StringArrayDeviceID(segments);
+ }
+
@Override
public byte[] getBytes() {
ByteArrayOutputStream publicBAOS = new ByteArrayOutputStream(256);
for (String segment : segments) {
try {
- publicBAOS.write(segment.getBytes(StandardCharsets.UTF_8));
+ publicBAOS.write(segment.getBytes(TSFileConfig.STRING_CHARSET));
} catch (IOException e) {
throw new TsFileRuntimeException(e);
}
@@ -127,4 +181,14 @@ public class StringArrayDeviceID implements IDeviceID {
public long ramBytesUsed() {
return INSTANCE_SIZE + RamUsageEstimator.sizeOf(segments);
}
+
+ @Override
+ public int serializedSize() {
+ int cnt = Integer.BYTES;
+ for (String segment : segments) {
+ cnt += Integer.BYTES;
+ cnt += segment.getBytes(TSFileConfig.STRING_CHARSET).length;
+ }
+ return cnt;
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
index 1a391d0a..c5625ecc 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
@@ -134,4 +134,8 @@ public class TableSchema {
}
return new TableSchema(tableName, measurementSchemas, columnTypes);
}
+
+ public String getTableName() {
+ return tableName;
+ }
}
diff --git a/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
b/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
index 3a682bf1..b89866b3 100644
--- a/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
+++ b/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
@@ -23,6 +23,7 @@ import org.apache.tsfile.common.constant.TsFileConstant;
import org.apache.tsfile.exception.PathParseException;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.PlainDeviceID;
+import org.apache.tsfile.file.metadata.StringArrayDeviceID;
import org.apache.tsfile.read.common.parser.PathNodesGenerator;
import org.apache.tsfile.utils.PublicBAOS;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -151,7 +152,7 @@ public class Path implements Serializable, Comparable<Path>
{
}
public IDeviceID getIDeviceID() {
- return new PlainDeviceID(getDevice());
+ return new
StringArrayDeviceID(getDevice().split(TsFileConstant.PATH_SEPARATER_NO_REGEX));
}
public String getMeasurement() {
diff --git a/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
b/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
index 6e55e760..84175bcb 100644
--- a/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
+++ b/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
@@ -378,7 +378,7 @@ public class ReadWriteIOUtils {
return len;
}
- byte[] bytes = s.getBytes();
+ byte[] bytes = s.getBytes(TSFileConfig.STRING_CHARSET);
len += write(bytes.length, outputStream);
outputStream.write(bytes);
len += bytes.length;
@@ -414,7 +414,7 @@ public class ReadWriteIOUtils {
return write(NO_BYTE_TO_READ, buffer);
}
int len = 0;
- byte[] bytes = s.getBytes();
+ byte[] bytes = s.getBytes(TSFileConfig.STRING_CHARSET);
len += write(bytes.length, buffer);
buffer.put(bytes);
len += bytes.length;
diff --git a/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
b/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
index b4d282d3..b9c5d0f3 100644
--- a/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
+++ b/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
@@ -129,7 +129,6 @@ public class TsFileWriter implements AutoCloseable {
*
* @param output the TsFileOutput of the file to be written by this
TsFileWriter
* @param schema the schema of this TsFile
- * @throws IOException
*/
public TsFileWriter(TsFileOutput output, Schema schema) throws IOException {
this(new TsFileIOWriter(output), schema,
TSFileDescriptor.getInstance().getConfig());
@@ -164,13 +163,13 @@ public class TsFileWriter implements AutoCloseable {
if (fileWriter instanceof RestorableTsFileIOWriter) {
Map<Path, IMeasurementSchema> schemaMap =
((RestorableTsFileIOWriter) fileWriter).getKnownSchema();
- Map<Path, MeasurementGroup> measurementGroupMap = new HashMap<>();
+ Map<IDeviceID, MeasurementGroup> measurementGroupMap = new HashMap<>();
for (Map.Entry<Path, IMeasurementSchema> entry : schemaMap.entrySet()) {
IMeasurementSchema measurementSchema = entry.getValue();
if (measurementSchema instanceof VectorMeasurementSchema) {
+ final IDeviceID deviceID =
IDeviceID.DEFAULT_FACTORY.create(entry.getKey().getDevice());
MeasurementGroup group =
- measurementGroupMap.getOrDefault(
- new Path(entry.getKey().getDevice()), new
MeasurementGroup(true));
+ measurementGroupMap.getOrDefault(deviceID, new
MeasurementGroup(true));
List<String> measurementList =
measurementSchema.getSubMeasurementsList();
for (int i = 0; i < measurementList.size(); i++) {
group
@@ -182,15 +181,15 @@ public class TsFileWriter implements AutoCloseable {
measurementSchema.getSubMeasurementsTSDataTypeList().get(i),
measurementSchema.getSubMeasurementsTSEncodingList().get(i)));
}
- measurementGroupMap.put(new Path(entry.getKey().getDevice()), group);
+ measurementGroupMap.put(deviceID, group);
} else {
+ final IDeviceID deviceID =
IDeviceID.DEFAULT_FACTORY.create(entry.getKey().getDevice());
MeasurementGroup group =
- measurementGroupMap.getOrDefault(
- new Path(entry.getKey().getDevice()), new
MeasurementGroup(false));
+ measurementGroupMap.getOrDefault(deviceID, new
MeasurementGroup(false));
group
.getMeasurementSchemaMap()
.put(measurementSchema.getMeasurementId(), (MeasurementSchema)
measurementSchema);
- measurementGroupMap.put(new Path(entry.getKey().getDevice()), group);
+ measurementGroupMap.put(deviceID, group);
}
}
getSchema().setRegisteredTimeseries(measurementGroupMap);
@@ -217,45 +216,37 @@ public class TsFileWriter implements AutoCloseable {
/**
* This method is used to register all timeseries in the specified template
under the specified
* device.
- *
- * @param deviceId
- * @param templateName
- * @throws WriteProcessException
*/
- public void registerDevice(String deviceId, String templateName) throws
WriteProcessException {
+ public void registerDevice(String deviceIdString, String templateName)
+ throws WriteProcessException {
+ IDeviceID deviceID = IDeviceID.DEFAULT_FACTORY.create(deviceIdString);
if (!getSchema().getSchemaTemplates().containsKey(templateName)) {
throw new WriteProcessException("given template is not existed! " +
templateName);
}
- if (getSchema().getRegisteredTimeseriesMap().containsKey(new
Path(deviceId))) {
+ if (getSchema().getRegisteredTimeseriesMap().containsKey(deviceID)) {
throw new WriteProcessException(
"this device "
- + deviceId
+ + deviceIdString
+ " has been registered, you can only use registerDevice method
to register empty device.");
}
- getSchema().registerDevice(deviceId, templateName);
+ getSchema().registerDevice(deviceID, templateName);
}
- /**
- * Register nonAligned timeseries by single.
- *
- * @param devicePath
- * @param measurementSchema
- * @throws WriteProcessException
- */
- public void registerTimeseries(Path devicePath, MeasurementSchema
measurementSchema)
+ /** Register nonAligned timeseries by single. */
+ public void registerTimeseries(IDeviceID deviceID, MeasurementSchema
measurementSchema)
throws WriteProcessException {
MeasurementGroup measurementGroup;
- if (getSchema().containsDevice(devicePath)) {
- measurementGroup = getSchema().getSeriesSchema(devicePath);
+ if (getSchema().containsDevice(deviceID)) {
+ measurementGroup = getSchema().getSeriesSchema(deviceID);
if (measurementGroup.isAligned()) {
throw new WriteProcessException(
- "given device " + devicePath + " has been registered for aligned
timeseries.");
+ "given device " + deviceID + " has been registered for aligned
timeseries.");
} else if (measurementGroup
.getMeasurementSchemaMap()
.containsKey(measurementSchema.getMeasurementId())) {
throw new WriteProcessException(
"given nonAligned timeseries "
- + (devicePath + "." + measurementSchema.getMeasurementId())
+ + (deviceID + "." + measurementSchema.getMeasurementId())
+ " has been registered.");
}
} else {
@@ -264,44 +255,40 @@ public class TsFileWriter implements AutoCloseable {
measurementGroup
.getMeasurementSchemaMap()
.put(measurementSchema.getMeasurementId(), measurementSchema);
- getSchema().registerMeasurementGroup(devicePath, measurementGroup);
+ getSchema().registerMeasurementGroup(deviceID, measurementGroup);
}
- /**
- * Register nonAligned timeseries by groups.
- *
- * @param devicePath
- * @param measurementSchemas
- */
+ /** Register nonAligned timeseries by groups. */
public void registerTimeseries(Path devicePath, List<MeasurementSchema>
measurementSchemas) {
for (MeasurementSchema schema : measurementSchemas) {
try {
- registerTimeseries(devicePath, schema);
+
registerTimeseries(IDeviceID.DEFAULT_FACTORY.create(devicePath.getDevice()),
schema);
} catch (WriteProcessException e) {
LOG.warn(e.getMessage());
}
}
}
+ public void registerAlignedTimeseries(Path devicePath,
List<MeasurementSchema> measurementSchemas)
+ throws WriteProcessException {
+ registerAlignedTimeseries(
+ IDeviceID.DEFAULT_FACTORY.create(devicePath.getDevice()),
measurementSchemas);
+ }
/**
* Register aligned timeseries. Once the device is registered for aligned
timeseries, it cannot be
* expanded.
- *
- * @param devicePath
- * @param measurementSchemas
- * @throws WriteProcessException
*/
- public void registerAlignedTimeseries(Path devicePath,
List<MeasurementSchema> measurementSchemas)
- throws WriteProcessException {
- if (getSchema().containsDevice(devicePath)) {
- if (getSchema().getSeriesSchema(devicePath).isAligned()) {
+ public void registerAlignedTimeseries(
+ IDeviceID deviceID, List<MeasurementSchema> measurementSchemas) throws
WriteProcessException {
+ if (getSchema().containsDevice(deviceID)) {
+ if (getSchema().getSeriesSchema(deviceID).isAligned()) {
throw new WriteProcessException(
"given device "
- + devicePath
+ + deviceID
+ " has been registered for aligned timeseries and should not
be expanded.");
} else {
throw new WriteProcessException(
- "given device " + devicePath + " has been registered for
nonAligned timeseries.");
+ "given device " + deviceID + " has been registered for nonAligned
timeseries.");
}
}
MeasurementGroup measurementGroup = new MeasurementGroup(true);
@@ -311,34 +298,30 @@ public class TsFileWriter implements AutoCloseable {
.getMeasurementSchemaMap()
.put(measurementSchema.getMeasurementId(), measurementSchema);
});
- getSchema().registerMeasurementGroup(devicePath, measurementGroup);
+ getSchema().registerMeasurementGroup(deviceID, measurementGroup);
}
private boolean checkIsTimeseriesExist(TSRecord record, boolean isAligned)
throws WriteProcessException, IOException {
// initial ChunkGroupWriter of this device in the TSRecord
- IChunkGroupWriter groupWriter =
- tryToInitialGroupWriter(new PlainDeviceID(record.deviceId), isAligned);
+ final IDeviceID deviceID =
IDeviceID.DEFAULT_FACTORY.create(record.deviceId);
+ IChunkGroupWriter groupWriter = tryToInitialGroupWriter(deviceID,
isAligned);
// initial all SeriesWriters of measurements in this TSRecord
- Path devicePath = new Path(record.deviceId);
List<MeasurementSchema> measurementSchemas;
- if (getSchema().containsDevice(devicePath)) {
+ if (getSchema().containsDevice(deviceID)) {
measurementSchemas =
checkIsAllMeasurementsInGroup(
- record.dataPointList, getSchema().getSeriesSchema(devicePath),
isAligned);
+ record.dataPointList, getSchema().getSeriesSchema(deviceID),
isAligned);
if (isAligned) {
for (IMeasurementSchema s : measurementSchemas) {
- if (flushedMeasurementsInDeviceMap.containsKey(
- new PlainDeviceID(devicePath.getFullPath()))
- && !flushedMeasurementsInDeviceMap
- .get(new PlainDeviceID(devicePath.getFullPath()))
- .contains(s.getMeasurementId())) {
+ if (flushedMeasurementsInDeviceMap.containsKey(deviceID)
+ &&
!flushedMeasurementsInDeviceMap.get(deviceID).contains(s.getMeasurementId())) {
throw new WriteProcessException(
"TsFile has flushed chunk group and should not add new
measurement "
+ s.getMeasurementId()
+ " in device "
- + devicePath.getFullPath());
+ + deviceID);
}
}
}
@@ -352,7 +335,7 @@ public class TsFileWriter implements AutoCloseable {
checkIsAllMeasurementsInGroup(record.dataPointList,
measurementGroup, isAligned);
groupWriter.tryToAddSeriesWriter(measurementSchemas);
} else {
- throw new NoMeasurementException("input devicePath is invalid: " +
devicePath);
+ throw new NoMeasurementException("input devicePath is invalid: " +
deviceID);
}
return true;
}
@@ -380,25 +363,21 @@ public class TsFileWriter implements AutoCloseable {
private void checkIsTimeseriesExist(Tablet tablet, boolean isAligned)
throws WriteProcessException, IOException {
- IChunkGroupWriter groupWriter =
- tryToInitialGroupWriter(new PlainDeviceID(tablet.insertTargetName),
isAligned);
+ final IDeviceID deviceID =
IDeviceID.DEFAULT_FACTORY.create(tablet.insertTargetName);
+ IChunkGroupWriter groupWriter = tryToInitialGroupWriter(deviceID,
isAligned);
- Path devicePath = new Path(tablet.insertTargetName);
List<MeasurementSchema> schemas = tablet.getSchemas();
- if (getSchema().containsDevice(devicePath)) {
- checkIsAllMeasurementsInGroup(getSchema().getSeriesSchema(devicePath),
schemas, isAligned);
+ if (getSchema().containsDevice(deviceID)) {
+ checkIsAllMeasurementsInGroup(getSchema().getSeriesSchema(deviceID),
schemas, isAligned);
if (isAligned) {
for (IMeasurementSchema s : schemas) {
- if (flushedMeasurementsInDeviceMap.containsKey(
- new PlainDeviceID(devicePath.getFullPath()))
- && !flushedMeasurementsInDeviceMap
- .get(new PlainDeviceID(devicePath.getFullPath()))
- .contains(s.getMeasurementId())) {
+ if (flushedMeasurementsInDeviceMap.containsKey(deviceID)
+ &&
!flushedMeasurementsInDeviceMap.get(deviceID).contains(s.getMeasurementId())) {
throw new WriteProcessException(
"TsFile has flushed chunk group and should not add new
measurement "
+ s.getMeasurementId()
+ " in device "
- + devicePath.getFullPath());
+ + deviceID);
}
}
}
@@ -410,7 +389,7 @@ public class TsFileWriter implements AutoCloseable {
checkIsAllMeasurementsInGroup(measurementGroup, schemas, isAligned);
groupWriter.tryToAddSeriesWriter(schemas);
} else {
- throw new NoMeasurementException("input devicePath is invalid: " +
devicePath);
+ throw new NoMeasurementException("input devicePath is invalid: " +
deviceID);
}
}
@@ -418,11 +397,6 @@ public class TsFileWriter implements AutoCloseable {
* If it's aligned, then all measurementSchemas should be contained in the
measurementGroup, or it
* will throw exception. If it's nonAligned, then remove the
measurementSchema that is not
* contained in the measurementGroup.
- *
- * @param measurementGroup
- * @param measurementSchemas
- * @param isAligned
- * @throws NoMeasurementException
*/
private void checkIsAllMeasurementsInGroup(
MeasurementGroup measurementGroup,
@@ -450,15 +424,7 @@ public class TsFileWriter implements AutoCloseable {
}
}
- /**
- * Check whether all measurements of dataPoints list are in the
measurementGroup.
- *
- * @param dataPoints
- * @param measurementGroup
- * @param isAligned
- * @return
- * @throws NoMeasurementException
- */
+ /** Check whether all measurements of dataPoints list are in the
measurementGroup. */
private List<MeasurementSchema> checkIsAllMeasurementsInGroup(
List<DataPoint> dataPoints, MeasurementGroup measurementGroup, boolean
isAligned)
throws NoMeasurementException {
@@ -709,4 +675,8 @@ public class TsFileWriter implements AutoCloseable {
public void setTableWriteAligned(boolean tableWriteAligned) {
isTableWriteAligned = tableWriteAligned;
}
+
+ public void registerTableSchema(TableSchema tableSchema) {
+ getSchema().registerTableSchema(tableSchema);
+ }
}
diff --git a/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
b/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
index 091d14b4..9a4689b6 100644
--- a/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
+++ b/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
@@ -22,7 +22,6 @@ import org.apache.tsfile.file.metadata.ChunkGroupMetadata;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.LogicalTableSchema;
import org.apache.tsfile.file.metadata.TableSchema;
-import org.apache.tsfile.read.common.Path;
import org.apache.tsfile.utils.MeasurementGroup;
import java.io.Serializable;
@@ -37,10 +36,10 @@ import java.util.Map;
public class Schema implements Serializable {
/**
- * Path (devicePath) -> measurementSchema By default, use the LinkedHashMap
to store the order of
+ * IDeviceID -> measurementSchema By default, use the LinkedHashMap to store
the order of
* insertion
*/
- private Map<Path, MeasurementGroup> registeredTimeseries;
+ private Map<IDeviceID, MeasurementGroup> registeredTimeseries;
/** template name -> (measurement -> MeasurementSchema) */
private Map<String, MeasurementGroup> schemaTemplates;
@@ -51,20 +50,20 @@ public class Schema implements Serializable {
this.registeredTimeseries = new LinkedHashMap<>();
}
- public Schema(Map<Path, MeasurementGroup> knownSchema) {
+ public Schema(Map<IDeviceID, MeasurementGroup> knownSchema) {
this.registeredTimeseries = knownSchema;
}
// This method can only register nonAligned timeseries.
- public void registerTimeseries(Path devicePath, MeasurementSchema
measurementSchema) {
+ public void registerTimeseries(IDeviceID deviceID, MeasurementSchema
measurementSchema) {
MeasurementGroup group =
- registeredTimeseries.getOrDefault(devicePath, new
MeasurementGroup(false));
+ registeredTimeseries.getOrDefault(deviceID, new
MeasurementGroup(false));
group.getMeasurementSchemaMap().put(measurementSchema.getMeasurementId(),
measurementSchema);
- this.registeredTimeseries.put(devicePath, group);
+ this.registeredTimeseries.put(deviceID, group);
}
- public void registerMeasurementGroup(Path devicePath, MeasurementGroup
measurementGroup) {
- this.registeredTimeseries.put(devicePath, measurementGroup);
+ public void registerMeasurementGroup(IDeviceID deviceID, MeasurementGroup
measurementGroup) {
+ this.registeredTimeseries.put(deviceID, measurementGroup);
}
public void registerSchemaTemplate(String templateName, MeasurementGroup
measurementGroup) {
@@ -74,8 +73,8 @@ public class Schema implements Serializable {
this.schemaTemplates.put(templateName, measurementGroup);
}
- public void registerTableSchema(String tableName, TableSchema tableSchema) {
- tableSchemaMap.put(tableName, tableSchema);
+ public void registerTableSchema(TableSchema tableSchema) {
+ tableSchemaMap.put(tableSchema.getTableName(), tableSchema);
}
/** If template does not exist, an nonAligned timeseries is created by
default */
@@ -90,17 +89,17 @@ public class Schema implements Serializable {
this.schemaTemplates.put(templateName, measurementGroup);
}
- public void registerDevice(String deviceId, String templateName) {
+ public void registerDevice(IDeviceID deviceId, String templateName) {
if (!schemaTemplates.containsKey(templateName)) {
return;
}
Map<String, MeasurementSchema> template =
schemaTemplates.get(templateName).getMeasurementSchemaMap();
boolean isAligned = schemaTemplates.get(templateName).isAligned();
- registerMeasurementGroup(new Path(deviceId), new
MeasurementGroup(isAligned, template));
+ registerMeasurementGroup(deviceId, new MeasurementGroup(isAligned,
template));
}
- public MeasurementGroup getSeriesSchema(Path devicePath) {
+ public MeasurementGroup getSeriesSchema(IDeviceID devicePath) {
return registeredTimeseries.get(devicePath);
}
@@ -109,16 +108,16 @@ public class Schema implements Serializable {
}
/** check if this schema contains a measurement named measurementId. */
- public boolean containsDevice(Path devicePath) {
+ public boolean containsDevice(IDeviceID devicePath) {
return registeredTimeseries.containsKey(devicePath);
}
- public void setRegisteredTimeseries(Map<Path, MeasurementGroup>
registeredTimeseries) {
+ public void setRegisteredTimeseries(Map<IDeviceID, MeasurementGroup>
registeredTimeseries) {
this.registeredTimeseries = registeredTimeseries;
}
// for test
- public Map<Path, MeasurementGroup> getRegisteredTimeseriesMap() {
+ public Map<IDeviceID, MeasurementGroup> getRegisteredTimeseriesMap() {
return registeredTimeseries;
}
diff --git
a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
index 103a84c8..60761199 100644
--- a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
+++ b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
@@ -51,9 +51,11 @@ public class Utils {
public static boolean isFileMetaDataEqual(TsFileMetadata metadata1,
TsFileMetadata metadata2) {
if (Utils.isTwoObjectsNotNULL(metadata1, metadata2, "File MetaData")) {
if (Utils.isTwoObjectsNotNULL(
- metadata1.getMetadataIndex(), metadata2.getMetadataIndex(),
"Metadata Index")) {
- MetadataIndexNode metaDataIndex1 = metadata1.getMetadataIndex();
- MetadataIndexNode metaDataIndex2 = metadata2.getMetadataIndex();
+ metadata1.getTableMetadataIndexNodeMap().get(""),
+ metadata2.getTableMetadataIndexNodeMap().get(""),
+ "Metadata " + "Index")) {
+ MetadataIndexNode metaDataIndex1 =
metadata1.getTableMetadataIndexNodeMap().get("");
+ MetadataIndexNode metaDataIndex2 =
metadata2.getTableMetadataIndexNodeMap().get("");
return metaDataIndex1.getChildren().size() ==
metaDataIndex2.getChildren().size();
}
}
diff --git
a/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
b/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
index 41f1ada7..c286c73e 100644
---
a/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
+++
b/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
@@ -284,7 +284,7 @@ public class MetadataIndexConstructorTest {
private void readMetaDataDFS(List<IDeviceID> devices, List<List<String>>
measurements) {
try (TsFileSequenceReader reader = new TsFileSequenceReader(FILE_PATH)) {
TsFileMetadata tsFileMetaData = reader.readFileMetadata();
- MetadataIndexNode metadataIndexNode = tsFileMetaData.getMetadataIndex();
+ MetadataIndexNode metadataIndexNode =
tsFileMetaData.getTableMetadataIndexNodeMap().get("");
deviceDFS(devices, measurements, reader, metadataIndexNode);
} catch (IOException e) {
e.printStackTrace();
diff --git
a/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
b/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
new file mode 100644
index 00000000..fb2db4bc
--- /dev/null
+++ b/tsfile/src/test/java/org/apache/tsfile/write/TableViewWriteTest.java
@@ -0,0 +1,141 @@
+/*
+ * 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.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.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.block.TsBlock;
+import org.apache.tsfile.read.controller.CachedChunkLoaderImpl;
+import org.apache.tsfile.read.controller.MetadataQuerierByFileImpl;
+import org.apache.tsfile.read.query.executor.TableQueryExecutor;
+import
org.apache.tsfile.read.query.executor.TableQueryExecutor.TableQueryOrdering;
+import org.apache.tsfile.read.reader.block.TsBlockReader;
+import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.record.Tablet.ColumnType;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class TableViewWriteTest {
+
+ private final String testDir = "target" + File.separator + "tableViewTest";
+ private final int idSchemaNum = 5;
+ private final int measurementSchemaNum = 5;
+ private TableSchema testTableSchema;
+
+ @Before
+ public void setUp() throws Exception {
+ new File(testDir).mkdirs();
+ testTableSchema = genTableSchema(0);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ FileUtils.deleteDirectory(new File(testDir));
+ }
+
+ @Test
+ public void testWriteOneTable() throws IOException, WriteProcessException,
ReadProcessException {
+ final File testFile = new File(testDir, "testFile");
+ TsFileWriter writer = new TsFileWriter(testFile);
+ writer.registerTableSchema(testTableSchema);
+
+ writer.writeTable(genTablet(testTableSchema, 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());
+ final TsBlockReader reader =
+ tableQueryExecutor.query(testTableSchema.getTableName(), columns,
null, null, null);
+ assertTrue(reader.hasNext());
+ final TsBlock result = reader.next();
+ assertEquals(100, result.getPositionCount());
+ }
+
+ private Tablet genTablet(TableSchema tableSchema, int offset, int num) {
+ Tablet tablet = new Tablet(tableSchema.getTableName(),
tableSchema.getColumnSchemas());
+ for (int i = 0; i < num; i++) {
+ tablet.addTimestamp(i, offset + i);
+ for (MeasurementSchema columnSchema : tableSchema.getColumnSchemas()) {
+ tablet.addValue(columnSchema.getMeasurementId(), i,
getValue(columnSchema.getType(), i));
+ }
+ }
+ tablet.rowSize = num;
+ return tablet;
+ }
+
+ public Object getValue(TSDataType dataType, int i) {
+ switch (dataType) {
+ case INT64:
+ return (long) i;
+ case TEXT:
+ return new Binary(String.valueOf(i), StandardCharsets.UTF_8);
+ default:
+ return i;
+ }
+ }
+
+ private TableSchema genTableSchema(int tableNum) {
+ List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+ List<ColumnType> columnTypes = new ArrayList<>();
+
+ for (int i = 0; i < idSchemaNum; i++) {
+ measurementSchemas.add(
+ new MeasurementSchema(
+ "id" + i, TSDataType.TEXT, TSEncoding.PLAIN,
CompressionType.UNCOMPRESSED));
+ columnTypes.add(ColumnType.ID);
+ }
+ for (int i = 0; i < measurementSchemaNum; i++) {
+ measurementSchemas.add(
+ new MeasurementSchema(
+ "s" + i, TSDataType.INT64, TSEncoding.PLAIN,
CompressionType.UNCOMPRESSED));
+ columnTypes.add(ColumnType.MEASUREMENT);
+ }
+ return new TableSchema("testTable" + tableNum, measurementSchemas,
columnTypes);
+ }
+}
diff --git
a/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
b/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
index dbda5319..e43839eb 100644
--- a/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
@@ -165,7 +165,7 @@ public class TsFileIOWriterTest {
// FileMetaData
TsFileMetadata metaData = reader.readFileMetadata();
- Assert.assertEquals(2, metaData.getMetadataIndex().getChildren().size());
+ Assert.assertEquals(2,
metaData.getTableMetadataIndexNodeMap().get("").getChildren().size());
}
private void writeChunkGroup(TsFileIOWriter writer, MeasurementSchema
measurementSchema)