You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/04/12 13:09:35 UTC
[incubator-iotdb] branch tag_manage updated: record alias and add
tagIndex in MManager
This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch tag_manage
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/tag_manage by this push:
new 79008ce record alias and add tagIndex in MManager
79008ce is described below
commit 79008ce7a1be4c0fa19b9cbc0f6e69da6deed13b
Author: qiaojialin <64...@qq.com>
AuthorDate: Sun Apr 12 21:09:17 2020 +0800
record alias and add tagIndex in MManager
---
.../iotdb/db/concurrent/WrappedRunnable.java | 1 -
.../org/apache/iotdb/db/metadata/MLogWriter.java | 108 +++++++++++
.../org/apache/iotdb/db/metadata/MManager.java | 202 +++++++++------------
.../java/org/apache/iotdb/db/metadata/MTree.java | 22 ++-
.../iotdb/db/metadata/mnode/InternalMNode.java | 5 +-
.../apache/iotdb/db/metadata/mnode/LeafMNode.java | 15 +-
.../org/apache/iotdb/db/metadata/mnode/MNode.java | 4 +-
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 7 +-
.../db/qp/physical/sys/CreateTimeSeriesPlan.java | 84 ++++++++-
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 4 +-
.../engine/modification/DeletionFileNodeTest.java | 8 +-
.../db/engine/modification/DeletionQueryTest.java | 36 ++--
.../storagegroup/FileNodeManagerBenchmark.java | 7 +-
.../iotdb/db/metadata/MManagerAdvancedTest.java | 56 ++++--
.../iotdb/db/metadata/MManagerImproveTest.java | 6 +-
.../org/apache/iotdb/db/metadata/MTreeTest.java | 50 ++---
.../apache/iotdb/db/writelog/PerformanceTest.java | 21 ++-
.../iotdb/db/writelog/recover/LogReplayerTest.java | 7 +-
.../db/writelog/recover/SeqTsFileRecoverTest.java | 8 +-
.../writelog/recover/UnseqTsFileRecoverTest.java | 21 ++-
.../iotdb/tsfile/utils/ReadWriteIOUtils.java | 40 ++++
21 files changed, 475 insertions(+), 237 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java b/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java
index 7b143a3..74eb7f2 100644
--- a/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java
+++ b/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java
@@ -19,7 +19,6 @@
package org.apache.iotdb.db.concurrent;
import com.google.common.base.Throwables;
-import org.apache.iotdb.db.sync.receiver.load.FileLoaderManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java b/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
new file mode 100644
index 0000000..57b85d0
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.metadata;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MLogWriter {
+
+ private static final Logger logger = LoggerFactory.getLogger(MLogWriter.class);
+ private BufferedWriter writer;
+
+ public MLogWriter(String schemaDir, String logFileName) throws IOException {
+ File metadataDir = SystemFileFactory.INSTANCE.getFile(schemaDir);
+ if (!metadataDir.exists()) {
+ if (metadataDir.mkdirs()) {
+ logger.info("create schema folder {}.", metadataDir);
+ } else {
+ logger.info("create schema folder {} failed.", metadataDir);
+ }
+ }
+
+ File logFile = SystemFileFactory.INSTANCE.getFile(schemaDir + File.pathSeparator + logFileName);
+
+ FileWriter fileWriter;
+ fileWriter = new FileWriter(logFile, true);
+ writer = new BufferedWriter(fileWriter);
+ }
+
+
+ public void close() throws IOException {
+ writer.close();
+ }
+
+ public void createTimeseries(CreateTimeSeriesPlan plan) throws IOException {
+ writer.write(String.format("%s,%s,%s,%s,%s", MetadataOperationType.CREATE_TIMESERIES,
+ plan.getPath().getFullPath(), plan.getDataType().serialize(), plan.getEncoding().serialize(),
+ plan.getCompressor().serialize()));
+
+ writer.write(",");
+ if (plan.getAlias() != null) {
+ writer.write(plan.getAlias());
+ }
+
+ writer.write(",");
+ if (plan.getProps() != null) {
+ boolean first = true;
+ for (Map.Entry entry : plan.getProps().entrySet()) {
+ if (first) {
+ writer.write(String.format("%s=%s", entry.getKey(), entry.getValue()));
+ first = false;
+ } else {
+ writer.write(String.format("&%s=%s", entry.getKey(), entry.getValue()));
+ }
+ }
+ }
+
+ writer.newLine();
+ writer.flush();
+ }
+
+ public void deleteTimeseries(String path) throws IOException {
+ writer.write(MetadataOperationType.DELETE_TIMESERIES + "," + path);
+ writer.newLine();
+ writer.flush();
+ }
+
+ public void setStorageGroup(String storageGroup) throws IOException {
+ writer.write(MetadataOperationType.SET_STORAGE_GROUP + "," + storageGroup);
+ writer.newLine();
+ writer.flush();
+ }
+
+ public void deleteStorageGroup(String storageGroup) throws IOException {
+ writer.write(MetadataOperationType.DELETE_STORAGE_GROUP + storageGroup);
+ writer.newLine();
+ writer.flush();
+ }
+
+ public void setTTL(String storageGroup, long ttl) throws IOException {
+ writer.write(String.format("%s,%s,%s", MetadataOperationType.SET_TTL, storageGroup, ttl));
+ writer.newLine();
+ writer.flush();
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 0ae8fbf..73a8248 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -19,10 +19,8 @@
package org.apache.iotdb.db.metadata;
import java.io.BufferedReader;
-import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
-import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -34,6 +32,7 @@ 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.concurrent.locks.ReentrantReadWriteLock;
import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -53,13 +52,14 @@ import org.apache.iotdb.db.metadata.mnode.MNode;
import org.apache.iotdb.db.metadata.mnode.StorageGroupMNode;
import org.apache.iotdb.db.monitor.MonitorConstants;
import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.db.utils.RandomDeleteCache;
import org.apache.iotdb.db.utils.TestOnly;
-import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.exception.cache.CacheException;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.read.common.Path;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,20 +79,30 @@ public class MManager {
// the log file seriesPath
private String logFilePath;
private MTree mtree;
- private BufferedWriter logWriter;
+ private MLogWriter logWriter;
private boolean writeToLog;
- private String schemaDir;
// device -> DeviceMNode
private RandomDeleteCache<String, MNode> mNodeCache;
+ // tag key -> tag value -> LeafMNode
+ private Map<String, Map<String, Set<LeafMNode>>> tagIndex = new HashMap<>();
+
private Map<String, Integer> seriesNumberInStorageGroups = new HashMap<>();
private long maxSeriesNumberAmongStorageGroup;
private boolean initialized;
private IoTDBConfig config;
+ private static class MManagerHolder {
+ private MManagerHolder() {
+ //allowed to do nothing
+ }
+
+ private static final MManager INSTANCE = new MManager();
+ }
+
private MManager() {
config = IoTDBDescriptor.getInstance().getConfig();
- schemaDir = config.getSchemaDir();
+ String schemaDir = config.getSchemaDir();
File schemaFolder = SystemFileFactory.INSTANCE.getFile(schemaDir);
if (!schemaFolder.exists()) {
if (schemaFolder.mkdirs()) {
@@ -102,6 +112,14 @@ public class MManager {
}
}
logFilePath = schemaDir + File.separator + MetadataConstant.METADATA_LOG;
+
+ try {
+ logWriter = new MLogWriter(schemaDir, MetadataConstant.METADATA_LOG);
+ } catch (IOException e) {
+ throw new RuntimeException("Can not init MLogWriter", e);
+ }
+
+ // do not write log when recover
writeToLog = false;
int cacheSize = config.getmManagerCacheSize();
@@ -203,19 +221,26 @@ public class MManager {
switch (args[0]) {
case MetadataOperationType.CREATE_TIMESERIES:
Map<String, String> props = null;
- if (args.length > 5) {
+ if (!args[5].isEmpty()){
+ String[] keyValues = args[5].split("&");
String[] kv;
- props = new HashMap<>(args.length - 5 + 1, 1);
- for (int k = 5; k < args.length; k++) {
- kv = args[k].split("=");
+ for (String keyValue : keyValues) {
+ kv = keyValue.split("=");
props.put(kv[0], kv[1]);
}
}
- createTimeseries(args[1], TSDataType.deserialize(Short.parseShort(args[2])),
+ String alias = null;
+ if (!args[6].isEmpty()) {
+ alias = args[6];
+ }
+
+ CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan(new Path(args[1]),
+ TSDataType.deserialize(Short.parseShort(args[2])),
TSEncoding.deserialize(Short.parseShort(args[3])),
CompressionType.deserialize(Short.parseShort(args[4])),
- props);
+ props, null, null, alias);
+ createTimeseries(plan);
break;
case MetadataOperationType.DELETE_TIMESERIES:
for (String deleteStorageGroup : deleteTimeseries(args[1])) {
@@ -238,42 +263,9 @@ public class MManager {
}
}
- private BufferedWriter getLogWriter() throws IOException {
- if (logWriter == null) {
- File logFile = SystemFileFactory.INSTANCE.getFile(logFilePath);
- File metadataDir = SystemFileFactory.INSTANCE.getFile(schemaDir);
- if (!metadataDir.exists()) {
- if (metadataDir.mkdirs()) {
- logger.info("create schema folder {}.", metadataDir);
- } else {
- logger.info("create schema folder {} failed.", metadataDir);
- }
- }
- FileWriter fileWriter;
- fileWriter = new FileWriter(logFile, true);
- logWriter = new BufferedWriter(fileWriter);
- }
- return logWriter;
- }
-
- public void createTimeseries(String path, MeasurementSchema schema) throws MetadataException {
- createTimeseries(path, schema.getType(), schema.getEncodingType(), schema.getCompressor(),
- schema.getProps());
- }
-
- /**
- * Add one timeseries to metadata tree, if the timeseries already exists, throw exception
- *
- * @param path the timeseries path
- * @param dataType the dateType {@code DataType} of the timeseries
- * @param encoding the encoding function {@code Encoding} of the timeseries
- * @param compressor the compressor function {@code Compressor} of the time series
- * @return whether the measurement occurs for the first time in this storage group (if true, the
- * measurement should be registered to the StorageEngine too)
- */
- public void createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
- CompressionType compressor, Map<String, String> props) throws MetadataException {
+ public void createTimeseries(CreateTimeSeriesPlan plan) throws MetadataException {
lock.writeLock().lock();
+ String path = plan.getPath().getFullPath();
try {
/*
* get the storage group with auto create schema
@@ -290,8 +282,33 @@ public class MManager {
setStorageGroup(storageGroupName);
}
- // create time series with memory check
- createTimeseriesWithMemoryCheckAndLog(path, dataType, encoding, compressor, props);
+ // create time series in MTree
+ LeafMNode leafMNode = mtree.createTimeseries(path, plan.getDataType(), plan.getEncoding(),
+ plan.getCompressor(), plan.getProps(), plan.getAlias());
+ try {
+ // check memory
+ IoTDBConfigDynamicAdapter.getInstance().addOrDeleteTimeSeries(1);
+ } catch (ConfigAdjusterException e) {
+ mtree.deleteTimeseriesAndReturnEmptyStorageGroup(path);
+ throw new MetadataException(e);
+ }
+ try {
+ // write to log
+ if (writeToLog) {
+ logWriter.createTimeseries(plan);
+ }
+ } catch (IOException e) {
+ throw new MetadataException(e.getMessage());
+ }
+
+ if (plan.getTags() != null) {
+ // tag key, tag value
+ for (Entry<String, String> entry : plan.getTags().entrySet()) {
+ tagIndex.computeIfAbsent(entry.getKey(), k -> new HashMap<>())
+ .computeIfAbsent(entry.getValue(), v -> new HashSet<>())
+ .add(leafMNode);
+ }
+ }
// update statistics
int size = seriesNumberInStorageGroups.get(storageGroupName);
@@ -304,53 +321,29 @@ public class MManager {
}
}
- @TestOnly
- public void createTimeseries(String path, String dataType, String encoding)
- throws MetadataException {
- lock.writeLock().lock();
- try {
- TSDataType tsDataType = TSDataType.valueOf(dataType);
- TSEncoding tsEncoding = TSEncoding.valueOf(encoding);
- CompressionType type = TSFileDescriptor.getInstance().getConfig().getCompressor();
- createTimeseriesWithMemoryCheckAndLog(path, tsDataType, tsEncoding, type,
- Collections.emptyMap());
- } finally {
- lock.writeLock().unlock();
- }
+ public Set<LeafMNode> queryTimeseriesByTag(String tagKey, String tagValue) {
+ return tagIndex.getOrDefault(tagKey, Collections.emptyMap())
+ .getOrDefault(tagValue, Collections.emptySet());
}
/**
- * timeseries will be added to MTree with check memory, and log to file
+ * Add one timeseries to metadata tree, if the timeseries already exists, throw exception
+ *
+ * @param path the timeseries path
+ * @param dataType the dateType {@code DataType} of the timeseries
+ * @param encoding the encoding function {@code Encoding} of the timeseries
+ * @param compressor the compressor function {@code Compressor} of the time series
+ * @return whether the measurement occurs for the first time in this storage group (if true, the
+ * measurement should be registered to the StorageEngine too)
*/
- private void createTimeseriesWithMemoryCheckAndLog(String timeseries, TSDataType dataType,
- TSEncoding encoding, CompressionType compressor, Map<String, String> props)
- throws MetadataException {
- mtree.createTimeseries(timeseries, dataType, encoding, compressor, props);
- try {
- // check memory
- IoTDBConfigDynamicAdapter.getInstance().addOrDeleteTimeSeries(1);
- } catch (ConfigAdjusterException e) {
- mtree.deleteTimeseriesAndReturnEmptyStorageGroup(timeseries);
- throw new MetadataException(e);
- }
- try {
- if (writeToLog) {
- BufferedWriter writer = getLogWriter();
- writer.write(String.format("%s,%s,%s,%s,%s", MetadataOperationType.CREATE_TIMESERIES,
- timeseries, dataType.serialize(), encoding.serialize(), compressor.serialize()));
- if (props != null) {
- for (Map.Entry entry : props.entrySet()) {
- writer.write(String.format(",%s=%s", entry.getKey(), entry.getValue()));
- }
- }
- writer.newLine();
- writer.flush();
- }
- } catch (IOException e) {
- throw new MetadataException(e.getMessage());
- }
+ public void createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
+ CompressionType compressor, Map<String, String> props) throws MetadataException {
+ createTimeseries(
+ new CreateTimeSeriesPlan(new Path(path), dataType, encoding, compressor, props, null, null,
+ null));
}
+
/**
* Delete all timeseries under the given path, may cross different storage group
*
@@ -400,10 +393,7 @@ public class MManager {
try {
String storageGroupName = mtree.deleteTimeseriesAndReturnEmptyStorageGroup(path);
if (writeToLog) {
- BufferedWriter writer = getLogWriter();
- writer.write(MetadataOperationType.DELETE_TIMESERIES + "," + path);
- writer.newLine();
- writer.flush();
+ logWriter.deleteTimeseries(path);
}
// TODO: delete the path node and all its ancestors
mNodeCache.clear();
@@ -435,10 +425,7 @@ public class MManager {
try {
mtree.setStorageGroup(storageGroup);
if (writeToLog) {
- BufferedWriter writer = getLogWriter();
- writer.write(MetadataOperationType.SET_STORAGE_GROUP + "," + storageGroup);
- writer.newLine();
- writer.flush();
+ logWriter.setStorageGroup(storageGroup);
}
IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(1);
ActiveTimeSeriesCounter.getInstance().init(storageGroup);
@@ -461,16 +448,13 @@ public class MManager {
public void deleteStorageGroups(List<String> storageGroups) throws MetadataException {
lock.writeLock().lock();
try {
- BufferedWriter writer = getLogWriter();
for (String storageGroup : storageGroups) {
// try to delete storage group
mtree.deleteStorageGroup(storageGroup);
// if success
if (writeToLog) {
- writer.write(MetadataOperationType.DELETE_STORAGE_GROUP + storageGroup);
- writer.newLine();
- writer.flush();
+ logWriter.deleteTimeseries(storageGroup);
}
mNodeCache.clear();
IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(-1);
@@ -777,24 +761,12 @@ public class MManager {
return maxSeriesNumberAmongStorageGroup;
}
- private static class MManagerHolder {
- private MManagerHolder() {
- //allowed to do nothing
- }
-
- private static final MManager INSTANCE = new MManager();
- }
-
public void setTTL(String storageGroup, long dataTTL) throws MetadataException, IOException {
lock.writeLock().lock();
try {
getStorageGroupNode(storageGroup).setDataTTL(dataTTL);
if (writeToLog) {
- BufferedWriter writer = getLogWriter();
- writer
- .write(String.format("%s,%s,%s", MetadataOperationType.SET_TTL, storageGroup, dataTTL));
- writer.newLine();
- writer.flush();
+ logWriter.setTTL(storageGroup, dataTTL);
}
} finally {
lock.writeLock().unlock();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index b243141..12e17be 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -75,9 +75,10 @@ public class MTree implements Serializable {
* @param encoding encoding
* @param compressor compressor
* @param props props
+ * @param alias alias of measurement
*/
- void createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
- CompressionType compressor, Map<String, String> props) throws MetadataException {
+ LeafMNode createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
+ CompressionType compressor, Map<String, String> props, String alias) throws MetadataException {
String[] nodeNames = MetaUtils.getNodeNames(path);
if (nodeNames.length <= 2 || !nodeNames[0].equals(root.getName())) {
throw new IllegalPathException(path);
@@ -94,7 +95,7 @@ public class MTree implements Serializable {
if (!hasSetStorageGroup) {
throw new StorageGroupNotSetException("Storage group should be created first");
}
- cur.addChild(new InternalMNode(cur, nodeName));
+ cur.addChild(nodeName, new InternalMNode(cur, nodeName));
}
cur = cur.getChild(nodeName);
}
@@ -105,8 +106,13 @@ public class MTree implements Serializable {
if (cur.hasChild(leafName)) {
throw new PathAlreadyExistException(path);
}
- MNode leaf = new LeafMNode(cur, leafName, dataType, encoding, compressor, props);
- cur.addChild(leaf);
+ MNode leaf = new LeafMNode(cur, leafName, alias, dataType, encoding, compressor, props);
+ cur.addChild(leafName, leaf);
+ // link alias to LeafMNode
+ if (alias != null) {
+ cur.addChild(alias, leaf);
+ }
+ return (LeafMNode) leaf;
}
/**
@@ -122,7 +128,7 @@ public class MTree implements Serializable {
MNode cur = root;
for (int i = 1; i < nodeNames.length; i++) {
if (!cur.hasChild(nodeNames[i])) {
- cur.addChild(new InternalMNode(cur, nodeNames[i]));
+ cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
}
cur = cur.getChild(nodeNames[i]);
}
@@ -167,7 +173,7 @@ public class MTree implements Serializable {
while (i < nodeNames.length - 1) {
MNode temp = cur.getChild(nodeNames[i]);
if (temp == null) {
- cur.addChild(new InternalMNode(cur, nodeNames[i]));
+ cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
} else if (temp instanceof StorageGroupMNode) {
// before set storage group, check whether the exists or not
throw new StorageGroupAlreadySetException(temp.getFullPath());
@@ -181,7 +187,7 @@ public class MTree implements Serializable {
} else {
StorageGroupMNode storageGroupMNode = new StorageGroupMNode(cur, nodeNames[i], path,
IoTDBDescriptor.getInstance().getConfig().getDefaultTTL());
- cur.addChild(storageGroupMNode);
+ cur.addChild(nodeNames[i], storageGroupMNode);
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index 4074b8b..2e8d2ed 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -38,10 +38,11 @@ public class InternalMNode extends MNode {
}
@Override
- public void addChild(MNode child) {
- this.children.put(child.getName(), child);
+ public void addChild(String name, MNode child) {
+ children.put(name, child);
}
+
@Override
public void deleteChild(String name) {
children.remove(name);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
index 1d72854..2463bed 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
@@ -34,13 +34,18 @@ public class LeafMNode extends MNode {
* measurement's Schema for one timeseries represented by current leaf node
*/
private MeasurementSchema schema;
+ private String alias;
private TimeValuePair cachedLastValuePair = null;
- public LeafMNode(MNode parent, String name, TSDataType dataType, TSEncoding encoding,
- CompressionType type, Map<String, String> props) {
- super(parent, name);
- this.schema = new MeasurementSchema(name, dataType, encoding, type, props);
+ /**
+ * @param alias alias of measurementName
+ */
+ public LeafMNode(MNode parent, String measurementName, String alias, TSDataType dataType,
+ TSEncoding encoding, CompressionType type, Map<String, String> props) {
+ super(parent, measurementName);
+ this.schema = new MeasurementSchema(measurementName, dataType, encoding, type, props);
+ this.alias = alias;
}
@Override
@@ -49,7 +54,7 @@ public class LeafMNode extends MNode {
}
@Override
- public void addChild(MNode child) {
+ public void addChild(String name, MNode child) {
// Do nothing
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
index d653bb1..95b2efc 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
@@ -56,9 +56,9 @@ public abstract class MNode implements Serializable {
public abstract boolean hasChild(String name);
/**
- * add the given child
+ * node key, name or alias
*/
- public abstract void addChild(MNode child);
+ public abstract void addChild(String name, MNode chile);
/**
* delete a child
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index efec48a..2e61456 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -881,13 +881,8 @@ public class PlanExecutor implements IPlanExecutor {
private boolean createTimeSeries(CreateTimeSeriesPlan createTimeSeriesPlan)
throws QueryProcessException {
- Path path = createTimeSeriesPlan.getPath();
- TSDataType dataType = createTimeSeriesPlan.getDataType();
- CompressionType compressor = createTimeSeriesPlan.getCompressor();
- TSEncoding encoding = createTimeSeriesPlan.getEncoding();
- Map<String, String> props = createTimeSeriesPlan.getAttributes();
try {
- mManager.createTimeseries(path.getFullPath(), dataType, encoding, compressor, props);
+ mManager.createTimeseries(createTimeSeriesPlan);
} catch (MetadataException e) {
throw new QueryProcessException(e);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
index 2980aed..b10091c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
@@ -22,8 +22,10 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
import org.apache.iotdb.db.qp.logical.Operator;
import org.apache.iotdb.db.qp.physical.PhysicalPlan;
@@ -31,6 +33,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
public class CreateTimeSeriesPlan extends PhysicalPlan {
@@ -39,8 +42,9 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
private TSEncoding encoding;
private CompressionType compressor;
private String alias;
- private Map<String, String> attributes;
+ private Map<String, String> props;
private Map<String, String> tags;
+ private Map<String, String> attributes;
public CreateTimeSeriesPlan() {
super(false, Operator.OperatorType.CREATE_TIMESERIES);
@@ -48,14 +52,16 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
}
public CreateTimeSeriesPlan(Path path, TSDataType dataType, TSEncoding encoding,
- CompressionType compressor, Map<String, String> attributes, Map<String, String> tags, String alias) {
+ CompressionType compressor, Map<String, String> props, Map<String, String> tags,
+ Map<String, String> attributes, String alias) {
super(false, Operator.OperatorType.CREATE_TIMESERIES);
this.path = path;
this.dataType = dataType;
this.encoding = encoding;
this.compressor = compressor;
- this.attributes = attributes;
+ this.props = props;
this.tags = tags;
+ this.attributes = attributes;
this.alias = alias;
canbeSplit = false;
}
@@ -116,6 +122,14 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
this.tags = tags;
}
+ public Map<String, String> getProps() {
+ return props;
+ }
+
+ public void setProps(Map<String, String> props) {
+ this.props = props;
+ }
+
@Override
public String toString() {
return String.format("seriesPath: %s, resultDataType: %s, encoding: %s, compression: %s", path,
@@ -130,23 +144,75 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
@Override
public void serializeTo(DataOutputStream stream) throws IOException {
stream.writeByte((byte) PhysicalPlanType.CREATE_TIMESERIES.ordinal());
- byte[] pathBytes = path.getFullPath().getBytes();
- stream.writeInt(pathBytes.length);
- stream.write(pathBytes);
+ byte[] bytes = path.getFullPath().getBytes();
+ stream.writeInt(bytes.length);
+ stream.write(bytes);
stream.write(dataType.ordinal());
stream.write(encoding.ordinal());
stream.write(compressor.ordinal());
+
+ // alias
+ if (alias != null) {
+ stream.write(1);
+ ReadWriteIOUtils.write(alias, stream);
+ } else {
+ stream.write(0);
+ }
+
+ // props
+ if (props != null && !props.isEmpty()) {
+ stream.write(1);
+ ReadWriteIOUtils.write(props, stream);
+ } else {
+ stream.write(0);
+ }
+
+ // tags
+ if (tags != null && !tags.isEmpty()) {
+ stream.write(1);
+ ReadWriteIOUtils.write(tags, stream);
+ } else {
+ stream.write(0);
+ }
+
+ // attributes
+ if (attributes != null && !attributes.isEmpty()) {
+ stream.write(1);
+ ReadWriteIOUtils.write(attributes, stream);
+ } else {
+ stream.write(0);
+ }
}
@Override
public void deserializeFrom(ByteBuffer buffer) {
int length = buffer.getInt();
- byte[] pathBytes = new byte[length];
- buffer.get(pathBytes);
- path = new Path(new String(pathBytes));
+ byte[] bytes = new byte[length];
+ buffer.get(bytes);
+ path = new Path(new String(bytes));
dataType = TSDataType.values()[buffer.get()];
encoding = TSEncoding.values()[buffer.get()];
compressor = CompressionType.values()[buffer.get()];
+
+ // alias
+ if (buffer.get() == 1) {
+ alias = ReadWriteIOUtils.readString(buffer);
+ }
+
+ // props
+ if (buffer.get() == 1) {
+ props = ReadWriteIOUtils.readMap(buffer);
+ }
+
+ // tags
+ if (buffer.get() == 1) {
+ tags = ReadWriteIOUtils.readMap(buffer);
+ }
+
+ // attributes
+ if (buffer.get() == 1) {
+ attributes = ReadWriteIOUtils.readMap(buffer);
+ }
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 8206025..9b30ecf 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -77,8 +77,8 @@ public class PhysicalGenerator {
case CREATE_TIMESERIES:
CreateTimeSeriesOperator addPath = (CreateTimeSeriesOperator) operator;
return new CreateTimeSeriesPlan(addPath.getPath(), addPath.getDataType(),
- addPath.getEncoding(), addPath.getCompressor(), addPath.getAttributes(),
- addPath.getTags(), addPath.getAlias());
+ addPath.getEncoding(), addPath.getCompressor(), Collections.emptyMap(),
+ addPath.getTags(), addPath.getAttributes(), addPath.getAlias());
case DELETE_TIMESERIES:
DeleteTimeSeriesOperator deletePath = (DeleteTimeSeriesOperator) operator;
return new DeleteTimeSeriesPlan(deletePath.getDeletePathList());
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
index 1bdf211..af34b0d 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
@@ -27,6 +27,7 @@ import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import org.apache.iotdb.db.conf.directories.DirectoryManager;
import org.apache.iotdb.db.engine.StorageEngine;
@@ -40,6 +41,7 @@ import org.apache.iotdb.db.metadata.MManager;
import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.query.control.QueryResourceManager;
import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.read.common.Path;
@@ -56,8 +58,8 @@ public class DeletionFileNodeTest {
private String processorName = "root.test";
private static String[] measurements = new String[10];
- private String dataType = TSDataType.DOUBLE.toString();
- private String encoding = TSEncoding.PLAIN.toString();
+ private TSDataType dataType = TSDataType.DOUBLE;
+ private TSEncoding encoding = TSEncoding.PLAIN;
static {
for (int i = 0; i < 10; i++) {
@@ -72,7 +74,7 @@ public class DeletionFileNodeTest {
MManager.getInstance().setStorageGroup(processorName);
for (int i = 0; i < 10; i++) {
MManager.getInstance().createTimeseries(processorName + "." + measurements[i], dataType,
- encoding);
+ encoding, TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
index 4ef2e0b..5899108 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
@@ -52,8 +52,8 @@ public class DeletionQueryTest {
private String processorName = "root.test";
private static String[] measurements = new String[10];
- private String dataType = TSDataType.DOUBLE.toString();
- private String encoding = TSEncoding.PLAIN.toString();
+ private TSDataType dataType = TSDataType.DOUBLE;
+ private TSEncoding encoding = TSEncoding.PLAIN;
private QueryRouter router = new QueryRouter();
static {
@@ -69,7 +69,7 @@ public class DeletionQueryTest {
MManager.getInstance().setStorageGroup(processorName);
for (int i = 0; i < 10; i++) {
MManager.getInstance().createTimeseries(processorName + "." + measurements[i], dataType,
- encoding);
+ encoding, TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
}
}
@@ -100,9 +100,9 @@ public class DeletionQueryTest {
pathList.add(new Path(processorName, measurements[4]));
pathList.add(new Path(processorName, measurements[5]));
List<TSDataType> dataTypes = new ArrayList<>();
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
RawDataQueryPlan queryPlan = new RawDataQueryPlan();
queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -139,9 +139,9 @@ public class DeletionQueryTest {
pathList.add(new Path(processorName, measurements[5]));
List<TSDataType> dataTypes = new ArrayList<>();
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
RawDataQueryPlan queryPlan = new RawDataQueryPlan();
queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -188,9 +188,9 @@ public class DeletionQueryTest {
pathList.add(new Path(processorName, measurements[4]));
pathList.add(new Path(processorName, measurements[5]));
List<TSDataType> dataTypes = new ArrayList<>();
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
RawDataQueryPlan queryPlan = new RawDataQueryPlan();
queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -238,9 +238,9 @@ public class DeletionQueryTest {
pathList.add(new Path(processorName, measurements[5]));
List<TSDataType> dataTypes = new ArrayList<>();
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
RawDataQueryPlan queryPlan = new RawDataQueryPlan();
queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -308,9 +308,9 @@ public class DeletionQueryTest {
pathList.add(new Path(processorName, measurements[4]));
pathList.add(new Path(processorName, measurements[5]));
List<TSDataType> dataTypes = new ArrayList<>();
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
- dataTypes.add(TSDataType.valueOf(dataType));
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
+ dataTypes.add(dataType);
RawDataQueryPlan queryPlan = new RawDataQueryPlan();
queryPlan.setDeduplicatedDataTypes(dataTypes);
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
index 99199ac..b2d091e 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.engine.storagegroup;
import java.io.IOException;
+import java.util.Collections;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.iotdb.db.engine.StorageEngine;
@@ -28,6 +29,7 @@ import org.apache.iotdb.db.metadata.MManager;
import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.db.utils.RandomNum;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.write.record.TSRecord;
@@ -67,8 +69,9 @@ public class FileNodeManagerBenchmark {
manager.setStorageGroup(prefix);
for (String device : devices) {
for (String measurement : measurements) {
- manager.createTimeseries(device + "." + measurement, TSDataType.INT64.toString(),
- TSEncoding.PLAIN.toString());
+ manager.createTimeseries(device + "." + measurement, TSDataType.INT64,
+ TSEncoding.PLAIN, TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections
+ .emptyMap());
}
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 87c7c84..877580f 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -22,13 +22,16 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.IOException;
+import java.util.Collections;
import java.util.List;
import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.WriteProcessException;
import org.apache.iotdb.db.metadata.mnode.LeafMNode;
import org.apache.iotdb.db.metadata.mnode.MNode;
import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.read.TimeValuePair;
import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
import org.junit.After;
@@ -50,19 +53,31 @@ public class MManagerAdvancedTest {
mmanager.setStorageGroup("root.vehicle.d1");
mmanager.setStorageGroup("root.vehicle.d2");
- mmanager.createTimeseries("root.vehicle.d0.s0", "INT32", "RLE");
- mmanager.createTimeseries("root.vehicle.d0.s1", "INT64", "RLE");
- mmanager.createTimeseries("root.vehicle.d0.s2", "FLOAT", "RLE");
- mmanager.createTimeseries("root.vehicle.d0.s3", "DOUBLE", "RLE");
- mmanager.createTimeseries("root.vehicle.d0.s4", "BOOLEAN", "PLAIN");
- mmanager.createTimeseries("root.vehicle.d0.s5", "TEXT", "PLAIN");
-
- mmanager.createTimeseries("root.vehicle.d1.s0", "INT32", "RLE");
- mmanager.createTimeseries("root.vehicle.d1.s1", "INT64", "RLE");
- mmanager.createTimeseries("root.vehicle.d1.s2", "FLOAT", "RLE");
- mmanager.createTimeseries("root.vehicle.d1.s3", "DOUBLE", "RLE");
- mmanager.createTimeseries("root.vehicle.d1.s4", "BOOLEAN", "PLAIN");
- mmanager.createTimeseries("root.vehicle.d1.s5", "TEXT", "PLAIN");
+ mmanager.createTimeseries("root.vehicle.d0.s0", TSDataType.INT32, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d0.s1", TSDataType.INT64, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d0.s2", TSDataType.FLOAT, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d0.s3", TSDataType.DOUBLE, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d0.s4", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d0.s5", TSDataType.TEXT, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+
+ mmanager.createTimeseries("root.vehicle.d1.s0", TSDataType.INT32, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d1.s1", TSDataType.INT64, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d1.s2", TSDataType.FLOAT, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d1.s3", TSDataType.DOUBLE, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d1.s4", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d1.s5", TSDataType.TEXT, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
}
@@ -105,10 +120,14 @@ public class MManagerAdvancedTest {
@Test
public void testCache() throws MetadataException {
- mmanager.createTimeseries("root.vehicle.d2.s0", "DOUBLE", "RLE");
- mmanager.createTimeseries("root.vehicle.d2.s1", "BOOLEAN", "PLAIN");
- mmanager.createTimeseries("root.vehicle.d2.s2.g0", "TEXT", "PLAIN");
- mmanager.createTimeseries("root.vehicle.d2.s3", "TEXT", "PLAIN");
+ mmanager.createTimeseries("root.vehicle.d2.s0", TSDataType.DOUBLE, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d2.s1", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d2.s2.g0", TSDataType.TEXT, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ mmanager.createTimeseries("root.vehicle.d2.s3", TSDataType.TEXT, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
MNode node = mmanager.getNodeByPath("root.vehicle.d0");
Assert.assertEquals(TSDataType.INT32, ((LeafMNode) node.getChild("s0")).getSchema().getType());
@@ -123,7 +142,8 @@ public class MManagerAdvancedTest {
@Test
public void testCachedLastTimeValue() throws MetadataException {
- mmanager.createTimeseries("root.vehicle.d2.s0", "DOUBLE", "RLE");
+ mmanager.createTimeseries("root.vehicle.d2.s0", TSDataType.DOUBLE, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
TimeValuePair tv1 = new TimeValuePair(1000, TsPrimitiveType.getByType(TSDataType.DOUBLE, 1.0));
TimeValuePair tv2 = new TimeValuePair(2000, TsPrimitiveType.getByType(TSDataType.DOUBLE, 3.0));
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
index bfccd56..1169dab 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -31,8 +32,10 @@ import org.apache.iotdb.db.exception.WriteProcessException;
import org.apache.iotdb.db.metadata.mnode.LeafMNode;
import org.apache.iotdb.db.metadata.mnode.MNode;
import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.exception.cache.CacheException;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -56,7 +59,8 @@ public class MManagerImproveTest {
for (int j = 0; j < DEVICE_NUM; j++) {
for (int i = 0; i < TIMESERIES_NUM; i++) {
String p = "root.t1.v2.d" + j + ".s" + i;
- mManager.createTimeseries(p, "TEXT", "RLE");
+ mManager.createTimeseries(p, TSDataType.TEXT, TSEncoding.RLE,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index 4eada5e..addfe99 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -55,7 +55,7 @@ public class MTreeTest {
root.setStorageGroup("root.laptop");
try {
root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
} catch (MetadataException e) {
e.printStackTrace();
fail(e.getMessage());
@@ -63,7 +63,7 @@ public class MTreeTest {
boolean hasException = false;
try {
root.createTimeseries("root.laptop.d1.s1.b", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
} catch (MetadataException e) {
hasException = true;
}
@@ -79,7 +79,7 @@ public class MTreeTest {
assertFalse(root.isPathExist("root.laptop.d1"));
try {
root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
} catch (MetadataException e1) {
fail(e1.getMessage());
}
@@ -88,7 +88,7 @@ public class MTreeTest {
assertFalse(root.isPathExist("root.laptop.d1.s2"));
try {
root.createTimeseries("aa.bb.cc", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
} catch (MetadataException e) {
Assert.assertEquals(String.format("%s is not a legal path", "aa.bb.cc"),
e.getMessage());
@@ -103,21 +103,21 @@ public class MTreeTest {
assertFalse(root.checkStorageGroupByPath("root.a.d0"));
root.setStorageGroup("root.a.d0");
root.createTimeseries("root.a.d0.s0", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
root.createTimeseries("root.a.d0.s1", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
assertFalse(root.isPathExist("root.a.d1"));
assertFalse(root.checkStorageGroupByPath("root.a.d1"));
root.setStorageGroup("root.a.d1");
root.createTimeseries("root.a.d1.s0", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
root.createTimeseries("root.a.d1.s1", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
root.setStorageGroup("root.a.b.d0");
root.createTimeseries("root.a.b.d0.s0", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
} catch (MetadataException e1) {
e1.printStackTrace();
@@ -149,35 +149,35 @@ public class MTreeTest {
root.setStorageGroup("root.a.d0");
root.createTimeseries("root.a.d0.s0", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root.createTimeseries("root.a.d0.s1", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root.setStorageGroup("root.a.d1");
root.createTimeseries("root.a.d1.s0", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root.createTimeseries("root.a.d1.s1", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root.setStorageGroup("root.a.b.d0");
root.createTimeseries("root.a.b.d0.s0", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root1.setStorageGroup("root.a.d0");
root1.createTimeseries("root.a.d0.s0", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root1.createTimeseries("root.a.d0.s1", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root2.setStorageGroup("root.a.d1");
root2.createTimeseries("root.a.d1.s0", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root2.createTimeseries("root.a.d1.s1", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
root3.setStorageGroup("root.a.b.d0");
root3.createTimeseries("root.a.b.d0.s0", TSDataType.valueOf("INT32"),
- TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+ TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
String[] metadatas = new String[3];
metadatas[0] = root1.toString();
@@ -227,16 +227,16 @@ public class MTreeTest {
try {
assertEquals("root.laptop.d1", root.getStorageGroupName("root.laptop.d1.s0"));
root.createTimeseries("root.laptop.d1.s0", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
assertEquals("root.laptop.d1", root.getStorageGroupName("root.laptop.d1.s1"));
root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
assertEquals("root.laptop.d2", root.getStorageGroupName("root.laptop.d2.s0"));
root.createTimeseries("root.laptop.d2.s0", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
assertEquals("root.laptop.d2", root.getStorageGroupName("root.laptop.d2.s1"));
root.createTimeseries("root.laptop.d2.s1", TSDataType.INT32, TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
} catch (MetadataException e) {
e.printStackTrace();
fail(e.getMessage());
@@ -296,9 +296,9 @@ public class MTreeTest {
root.setStorageGroup("root.laptop.d1");
root.setStorageGroup("root.laptop.d2");
root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.PLAIN,
- CompressionType.GZIP, null);
+ CompressionType.GZIP, null, null);
root.createTimeseries("root.laptop.d1.s2", TSDataType.INT32, TSEncoding.PLAIN,
- CompressionType.GZIP, null);
+ CompressionType.GZIP, null, null);
List<String> list = new ArrayList<>();
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
index 432d527..b118f05 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.writelog;
import java.io.File;
import java.io.IOException;
+import java.util.Collections;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -31,6 +32,7 @@ import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.db.writelog.node.ExclusiveWriteLogNode;
import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.read.common.Path;
@@ -129,17 +131,18 @@ public class PerformanceTest {
MManager.getInstance().setStorageGroup("root.logTestDevice");
} catch (MetadataException ignored) {
}
- MManager.getInstance().createTimeseries("root.logTestDevice.s1",
- TSDataType.DOUBLE.name(),
- TSEncoding.PLAIN.name());
MManager.getInstance()
- .createTimeseries("root.logTestDevice.s2", TSDataType.INT32.name(),
- TSEncoding.PLAIN.name());
+ .createTimeseries("root.logTestDevice.s1", TSDataType.DOUBLE, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
MManager.getInstance()
- .createTimeseries("root.logTestDevice.s3", TSDataType.TEXT.name(),
- TSEncoding.PLAIN.name());
- MManager.getInstance().createTimeseries("root.logTestDevice.s4", TSDataType.BOOLEAN.name(),
- TSEncoding.PLAIN.name());
+ .createTimeseries("root.logTestDevice.s2", TSDataType.INT32, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ MManager.getInstance()
+ .createTimeseries("root.logTestDevice.s3", TSDataType.TEXT, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+ MManager.getInstance()
+ .createTimeseries("root.logTestDevice.s4", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
WriteLogNode logNode = new ExclusiveWriteLogNode("root.logTestDevice");
for (int i = 0; i < 1000000; i++) {
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
index 77cfac1..fc1005c 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
@@ -45,6 +45,7 @@ import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.read.reader.IPointReader;
@@ -92,8 +93,10 @@ public class LogReplayerTest {
try {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
- MManager.getInstance().createTimeseries("root.sg.device" + i + ".sensor" + j,
- new MeasurementSchema("sensor" + j, TSDataType.INT64, TSEncoding.PLAIN));
+ MManager.getInstance()
+ .createTimeseries("root.sg.device" + i + ".sensor" + j, TSDataType.INT64,
+ TSEncoding.PLAIN, TSFileDescriptor.getInstance().getConfig().getCompressor(),
+ Collections.emptyMap());
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
index 3c2a38b..5c51d9a 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -43,6 +44,7 @@ import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -96,8 +98,10 @@ public class SeqTsFileRecoverTest {
MManager.getInstance().setStorageGroup("root.sg");
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
- MManager.getInstance().createTimeseries("root.sg.device" + i + ".sensor" + j,
- new MeasurementSchema("sensor" + i, TSDataType.INT64, TSEncoding.PLAIN));
+ MManager.getInstance()
+ .createTimeseries("root.sg.device" + i + ".sensor" + j, TSDataType.INT64,
+ TSEncoding.PLAIN, TSFileDescriptor.getInstance().getConfig().getCompressor(),
+ Collections.emptyMap());
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
index a1ae8bd..b285dd0 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.writelog.recover;
+import java.util.Collections;
import org.apache.commons.io.FileUtils;
import org.apache.iotdb.db.conf.adapter.ActiveTimeSeriesCounter;
import org.apache.iotdb.db.constant.TestConstant;
@@ -35,6 +36,7 @@ import org.apache.iotdb.db.query.reader.universal.PriorityMergeReader;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -96,21 +98,26 @@ public class UnseqTsFileRecoverTest {
Path path = new Path(("root.sg.device" + i), ("sensor" + j));
MeasurementSchema measurementSchema = new MeasurementSchema("sensor" + j, TSDataType.INT64, TSEncoding.PLAIN);
schema.registerTimeseries(path, measurementSchema);
- MManager.getInstance().createTimeseries(path.getFullPath(), measurementSchema);
+ MManager.getInstance().createTimeseries(path.getFullPath(), measurementSchema.getType(),
+ measurementSchema.getEncodingType(), measurementSchema.getCompressor(),
+ measurementSchema.getProps());
}
}
schema.registerTimeseries(new Path(("root.sg.device99"), ("sensor4")),
new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
- MManager.getInstance().createTimeseries("root.sg.device99.sensor4",
- new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
+ MManager.getInstance()
+ .createTimeseries("root.sg.device99.sensor4", TSDataType.INT64, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
schema.registerTimeseries(new Path(("root.sg.device99"), ("sensor2")),
new MeasurementSchema("sensor2", TSDataType.INT64, TSEncoding.PLAIN));
- MManager.getInstance().createTimeseries("root.sg.device99.sensor2",
- new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
+ MManager.getInstance()
+ .createTimeseries("root.sg.device99.sensor2", TSDataType.INT64, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
schema.registerTimeseries(new Path(("root.sg.device99"), ("sensor1")),
new MeasurementSchema("sensor1", TSDataType.INT64, TSEncoding.PLAIN));
- MManager.getInstance().createTimeseries("root.sg.device99.sensor1",
- new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
+ MManager.getInstance()
+ .createTimeseries("root.sg.device99.sensor1", TSDataType.INT64, TSEncoding.PLAIN,
+ TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
writer = new TsFileWriter(tsF, schema);
TSRecord tsRecord = new TSRecord(100, "root.sg.device99");
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
index 48997b7..35dbf4f 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
@@ -36,7 +36,10 @@ import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -120,6 +123,28 @@ public class ReadWriteIOUtils {
return readBool(buffer);
}
+ public static int write(Map<String, String> map, DataOutputStream stream) throws IOException {
+ int length = 0;
+ byte[] bytes;
+ stream.write(map.size());
+ length += 4;
+ for (Entry<String, String> entry : map.entrySet()) {
+ bytes = entry.getKey().getBytes();
+ stream.write(bytes.length);
+ length += 4;
+ stream.write(bytes);
+ length += bytes.length;
+ bytes = entry.getValue().getBytes();
+ stream.write(bytes.length);
+ length += 4;
+ stream.write(bytes);
+ length += bytes.length;
+ }
+ return length;
+ }
+
+
+
/**
* write a int value to outputStream according to flag. If flag is true, write 1, else write 0.
*/
@@ -553,6 +578,21 @@ public class ReadWriteIOUtils {
return bytes;
}
+
+ public static Map<String, String> readMap(ByteBuffer buffer) {
+ int length = readInt(buffer);
+ Map<String, String> map = new HashMap<>(length);
+ for (int i = 0; i < length; i++) {
+ // key
+ String key = readString(buffer);
+ // value
+ String value = readString(buffer);
+ map.put(key, value);
+ }
+ return map;
+ }
+
+
/**
* unlike InputStream.read(bytes), this method makes sure that you can read length bytes or reach
* to the end of the stream.