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

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


The following commit(s) were added to refs/heads/rel/0.10 by this push:
     new 7f2b282  [To rel/0.10][ISSUE#1599]check datatype with encoding (#1602)
7f2b282 is described below

commit 7f2b282c3f4e172e0a8fb2ecd5d7c1fc8d5444ee
Author: Boris <[email protected]>
AuthorDate: Fri Aug 7 11:49:51 2020 +0800

    [To rel/0.10][ISSUE#1599]check datatype with encoding (#1602)
    
    * Update SchemaUtils.java
---
 .../org/apache/iotdb/db/metadata/MManager.java     |  5 +--
 .../apache/iotdb/db/metrics/ui/MetricsPage.java    |  3 +-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     | 39 ++++++++++++++++++++++
 .../iotdb/db/metadata/MManagerBasicTest.java       | 35 +++++++++++++++++++
 .../iotdb/db/metadata/MManagerImproveTest.java     |  2 +-
 5 files changed, 79 insertions(+), 5 deletions(-)

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 9c20c8e..cb2a2fb 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
@@ -61,6 +61,7 @@ import 
org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.query.dataset.ShowTimeSeriesResult;
 import org.apache.iotdb.db.utils.RandomDeleteCache;
+import org.apache.iotdb.db.utils.SchemaUtils;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.tsfile.exception.cache.CacheException;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -292,8 +293,9 @@ public class MManager {
 
   public void createTimeseries(CreateTimeSeriesPlan plan, long offset) throws 
MetadataException {
     lock.writeLock().lock();
-    String path = plan.getPath().getFullPath();
     try {
+      String path = plan.getPath().getFullPath();
+      SchemaUtils.checkDataTypeWithEncoding(plan.getDataType(), 
plan.getEncoding());
       /*
        * get the storage group with auto create schema
        */
@@ -345,7 +347,6 @@ public class MManager {
         logWriter.createTimeseries(plan, offset);
       }
       leafMNode.setOffset(offset);
-
     } catch (IOException | ConfigAdjusterException e) {
       throw new MetadataException(e.getMessage());
     } finally {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java 
b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java
index b6760f8..5003241 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java
@@ -14,13 +14,13 @@
  */
 package org.apache.iotdb.db.metrics.ui;
 
+import com.codahale.metrics.MetricRegistry;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -29,7 +29,6 @@ import org.apache.iotdb.db.service.TSServiceImpl;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementResp;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.codahale.metrics.MetricRegistry;
 
 public class MetricsPage {
 
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java 
b/server/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
index fd359e1..6ab5d51 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java
@@ -21,7 +21,11 @@ package org.apache.iotdb.db.utils;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.metadata.PathAlreadyExistException;
 import org.apache.iotdb.db.metadata.MManager;
@@ -40,6 +44,33 @@ public class SchemaUtils {
 
   }
 
+  private static Map<TSDataType, Set<TSEncoding>> schemaChecker = new 
EnumMap<>(TSDataType.class);
+
+  static {
+    Set<TSEncoding> booleanSet = new HashSet<>();
+    booleanSet.add(TSEncoding.PLAIN);
+    booleanSet.add(TSEncoding.RLE);
+    schemaChecker.put(TSDataType.BOOLEAN, booleanSet);
+    Set<TSEncoding> int32Set = new HashSet<>();
+    int32Set.add(TSEncoding.PLAIN);
+    int32Set.add(TSEncoding.RLE);
+    int32Set.add(TSEncoding.TS_2DIFF);
+    int32Set.add(TSEncoding.REGULAR);
+    schemaChecker.put(TSDataType.INT32, int32Set);
+    schemaChecker.put(TSDataType.INT64, int32Set);
+    Set<TSEncoding> floatSet = new HashSet<>();
+    floatSet.add(TSEncoding.PLAIN);
+    floatSet.add(TSEncoding.RLE);
+    floatSet.add(TSEncoding.TS_2DIFF);
+    floatSet.add(TSEncoding.GORILLA);
+    schemaChecker.put(TSDataType.FLOAT, floatSet);
+    schemaChecker.put(TSDataType.DOUBLE, floatSet);
+    Set<TSEncoding> textSet = new HashSet<>();
+    textSet.add(TSEncoding.PLAIN);
+    schemaChecker.put(TSDataType.TEXT, textSet);
+  }
+
+
   private static final Logger logger = 
LoggerFactory.getLogger(SchemaUtils.class);
 
   public static void registerTimeseries(MeasurementSchema schema) {
@@ -140,4 +171,12 @@ public class SchemaUtils {
             "aggregate does not support " + aggregation + " function.");
     }
   }
+
+
+  public static void checkDataTypeWithEncoding(TSDataType dataType, TSEncoding 
encoding)
+      throws MetadataException {
+    if(!schemaChecker.get(dataType).contains(encoding)) {
+      throw new MetadataException(String.format("encoding %s does not support 
%s", dataType.toString(), encoding.toString()));
+    }
+  }
 }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index cbd14d4..0725293 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -412,4 +412,39 @@ public class MManagerBasicTest {
       fail(e.getMessage());
     }
   }
+
+  @Test
+  public void testInvalidSchema() throws MetadataException {
+    MManager manager = MManager.getInstance();
+    manager.setStorageGroup("root.sg1");
+
+    try {
+      manager.createTimeseries("root.sg1.d1.s1", TSDataType.BOOLEAN, 
TSEncoding.TS_2DIFF,
+          CompressionType.GZIP, null);
+    } catch (Exception e) {
+      Assert.assertEquals("encoding BOOLEAN does not support TS_2DIFF", 
e.getMessage());
+    }
+
+    try {
+      manager.createTimeseries("root.sg1.d1.s2", TSDataType.INT32, 
TSEncoding.GORILLA,
+          CompressionType.GZIP, null);
+    } catch (Exception e) {
+      Assert.assertEquals("encoding INT32 does not support GORILLA", 
e.getMessage());
+    }
+
+    try {
+      manager.createTimeseries("root.sg1.d1.s3", TSDataType.DOUBLE, 
TSEncoding.REGULAR,
+          CompressionType.GZIP, null);
+    } catch (Exception e) {
+      Assert.assertEquals("encoding DOUBLE does not support REGULAR", 
e.getMessage());
+    }
+
+    try {
+      manager.createTimeseries("root.sg1.d1.s4", TSDataType.TEXT, 
TSEncoding.TS_2DIFF,
+          CompressionType.GZIP, null);
+    } catch (Exception e) {
+      Assert.assertEquals("encoding TEXT does not support TS_2DIFF", 
e.getMessage());
+    }
+
+  }
 }
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 3aaac3a..2ff37e8 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
@@ -56,7 +56,7 @@ 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, TSDataType.TEXT, TSEncoding.RLE,
+        mManager.createTimeseries(p, TSDataType.TEXT, TSEncoding.PLAIN,
             TSFileDescriptor.getInstance().getConfig().getCompressor(), 
Collections.emptyMap());
       }
     }

Reply via email to