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 2021/01/12 08:40:33 UTC

[iotdb] branch rel/0.11 updated: enable TsFile insertTablet with only a template (#2474)

This is an automated email from the ASF dual-hosted git repository.

qiaojialin pushed a commit to branch rel/0.11
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.11 by this push:
     new 617e3b4  enable TsFile insertTablet with only a template (#2474)
617e3b4 is described below

commit 617e3b4c5b7a2a71fb97b1068aba9156c813849a
Author: Jialin Qiao <qj...@mails.tsinghua.edu.cn>
AuthorDate: Tue Jan 12 16:00:25 2021 +0800

    enable TsFile insertTablet with only a template (#2474)
    
    (cherry picked from commit 680bb1a787f8563501802987cfa8f8255c18a4ca)
---
 .../apache/iotdb/tsfile/write/TsFileWriter.java    |  13 ++-
 .../tsfile/write/DefaultDeviceTemplateTest.java    | 110 +++++++++++++++++++++
 2 files changed, 120 insertions(+), 3 deletions(-)

diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
index 5346847..f6095d3 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/TsFileWriter.java
@@ -225,9 +225,16 @@ public class TsFileWriter implements AutoCloseable {
     // add all SeriesWriter of measurements in this Tablet to this ChunkGroupWriter
     for (MeasurementSchema timeseries : tablet.getSchemas()) {
       String measurementId = timeseries.getMeasurementId();
-      if (schema.containsTimeseries(new Path(deviceId, measurementId))) {
-        groupWriter.tryToAddSeriesWriter(schema.getSeriesSchema(new Path(deviceId, measurementId)),
-            pageSize);
+      Path path = new Path(deviceId, measurementId);
+      if (schema.containsTimeseries(path)) {
+        groupWriter.tryToAddSeriesWriter(schema.getSeriesSchema(path), pageSize);
+      } else if (schema.getDeviceTemplates() != null && schema.getDeviceTemplates().size() == 1) {
+        // use the default template without needing to register device
+        Map<String, MeasurementSchema> template = schema.getDeviceTemplates()
+            .entrySet().iterator().next().getValue();
+        if (template.containsKey(path.getMeasurement())) {
+          groupWriter.tryToAddSeriesWriter(template.get(path.getMeasurement()), pageSize);
+        }
       } else {
         throw new NoMeasurementException("input measurement is invalid: " + measurementId);
       }
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultDeviceTemplateTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultDeviceTemplateTest.java
new file mode 100644
index 0000000..dcf325a
--- /dev/null
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/DefaultDeviceTemplateTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.tsfile.write;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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;
+import org.apache.iotdb.tsfile.read.ReadOnlyTsFile;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.write.record.Tablet;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DefaultDeviceTemplateTest {
+
+  @Test
+  public void testUsingDefaultDeviceTemplate() throws IOException, WriteProcessException {
+    File file = new File("target/defaultDeviceTemplate.tsfile");
+    try (TsFileWriter writer = new TsFileWriter(file)) {
+      MeasurementSchema s1 = new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.PLAIN);
+      MeasurementSchema s2 = new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.PLAIN);
+
+      List<MeasurementSchema> schemaList = new ArrayList<>();
+      schemaList.add(s1);
+      schemaList.add(s2);
+
+      Map<String, MeasurementSchema> schema = new HashMap<>();
+      schema.put("s1", s1);
+      schema.put("s2", s2);
+
+      writer.registerDeviceTemplate("defaultTemplate", schema);
+
+      Tablet tablet = new Tablet("d1", schemaList);
+      long[] timestamps = tablet.timestamps;
+      Object[] values = tablet.values;
+
+      long timestamp = 1;
+      long value = 1L;
+
+      for (int r = 0; r < 10; r++, value++) {
+        int row = tablet.rowSize++;
+        timestamps[row] = timestamp++;
+        for (int i = 0; i < 2; i++) {
+          long[] sensor = (long[]) values[i];
+          sensor[row] = value;
+        }
+        // write Tablet to TsFile
+        if (tablet.rowSize == tablet.getMaxRowNumber()) {
+          writer.write(tablet);
+          tablet.reset();
+        }
+      }
+      // write Tablet to TsFile
+      if (tablet.rowSize != 0) {
+        writer.write(tablet);
+        tablet.reset();
+      }
+    }
+
+    try (TsFileSequenceReader reader = new TsFileSequenceReader(file.getPath());
+        ReadOnlyTsFile readTsFile = new ReadOnlyTsFile(reader)) {
+
+      // use these paths(all measurements) for all the queries
+      ArrayList<Path> paths = new ArrayList<>();
+      paths.add(new Path("d1", "s1"));
+
+      QueryExpression queryExpression = QueryExpression.create(paths, null);
+      QueryDataSet queryDataSet = readTsFile.query(queryExpression);
+      int count = 0;
+      while (queryDataSet.hasNext()) {
+        queryDataSet.next();
+        count ++;
+      }
+
+      Assert.assertEquals(10, count);
+    }
+
+
+    Files.deleteIfExists(file.toPath());
+
+  }
+
+}