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/12/11 13:08:47 UTC

[iotdb] 02/02: getObject should not return String for all data types (#2247)

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

commit 6e7a2013bb16f840a10b9ed4a7f654e93a9fa312
Author: Xiangwei Wei <34...@users.noreply.github.com>
AuthorDate: Fri Dec 11 21:06:48 2020 +0800

    getObject should not return String for all data types (#2247)
    
    (cherry picked from commit f2e741335667663c0a0445a9c06c64a8b92d0c00)
---
 .../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java |  43 ++++-
 .../iotdb/session/IoTDBSessionIteratorIT.java      | 178 +++++++++++++++++----
 2 files changed, 182 insertions(+), 39 deletions(-)

diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
index eb4aa77..9ecf45a 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.rpc;
 
-import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -366,7 +366,7 @@ public class IoTDBRpcDataSet {
   }
 
   public Object getObject(String columnName) throws StatementExecutionException {
-    return getValueByName(columnName);
+    return getObjectByName(columnName);
   }
 
   public String getString(int columnIndex) throws StatementExecutionException {
@@ -416,11 +416,40 @@ public class IoTDBRpcDataSet {
       case DOUBLE:
         return String.valueOf(BytesUtils.bytesToDouble(values[index]));
       case TEXT:
-        try {
-          return new String(values[index], "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-          return new String(values[index]);
-        }
+        return new String(values[index], StandardCharsets.UTF_8);
+      default:
+        return null;
+    }
+  }
+
+  public Object getObjectByName(String columnName) throws StatementExecutionException {
+    checkRecord();
+    if (columnName.equals(TIMESTAMP_STR)) {
+      return BytesUtils.bytesToLong(time);
+    }
+    int index = columnOrdinalMap.get(columnName) - START_INDEX;
+    if (index < 0 || index >= values.length || isNull(index, rowsIndex - 1)) {
+      lastReadWasNull = true;
+      return null;
+    }
+    lastReadWasNull = false;
+    return getObject(index, columnTypeDeduplicatedList.get(index), values);
+  }
+
+  public Object getObject(int index, TSDataType tsDataType, byte[][] values) {
+    switch (tsDataType) {
+      case BOOLEAN:
+        return BytesUtils.bytesToBool(values[index]);
+      case INT32:
+        return BytesUtils.bytesToInt(values[index]);
+      case INT64:
+        return BytesUtils.bytesToLong(values[index]);
+      case FLOAT:
+        return BytesUtils.bytesToFloat(values[index]);
+      case DOUBLE:
+        return BytesUtils.bytesToDouble(values[index]);
+      case TEXT:
+        return new String(values[index], StandardCharsets.UTF_8);
       default:
         return null;
     }
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIteratorIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIteratorIT.java
index ed6a24b..439be74 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIteratorIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIteratorIT.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.session;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
@@ -53,30 +54,126 @@ public class IoTDBSessionIteratorIT {
     EnvironmentUtils.cleanEnv();
   }
 
+  /**
+   * Test getBoolean(), getInt(), getLong(), getFloat(), getDouble(), getString() by columnIndex
+   */
   @Test
-  public void test1() {
+  public void testGetValueByColumnIndex() {
     String[] retArray = new String[]{
-        "0,1,2.0,null",
-        "1,1,2.0,null",
-        "2,1,2.0,null",
-        "3,1,2.0,null",
-        "4,1,2.0,null",
-        "5,1,2.0,4.0",
-        "6,1,2.0,4.0",
-        "7,1,2.0,4.0",
-        "8,1,2.0,4.0",
-        "9,1,2.0,4.0",
+        "0,true,0,0,0.0,0.0,time0",
+        "1,false,1,10,1.5,2.5,time1",
+        "2,true,2,20,3.0,5.0,time2",
+        "3,false,3,30,4.5,7.5,time3",
+        "4,true,4,40,6.0,10.0,time4",
+        "5,false,5,50,7.5,12.5,time5",
+        "6,true,6,60,9.0,15.0,time6",
+        "7,false,7,70,10.5,17.5,time7",
+        "8,true,8,80,12.0,20.0,time8",
+        "9,false,9,90,13.5,22.5,time9",
     };
 
     try {
-      SessionDataSet sessionDataSet = session.executeQueryStatement("select * from root.sg1");
+      SessionDataSet sessionDataSet = session
+          .executeQueryStatement("select s1,s2,s3,s4,s5,s6 from root.sg1.d1");
       sessionDataSet.setFetchSize(1024);
       DataIterator iterator = sessionDataSet.iterator();
       int count = 0;
       while (iterator.next()) {
-        String ans = String.format("%s,%s,%s,%s", iterator.getLong(1), iterator.getInt("root.sg1.d1.s1"),
-            iterator.getFloat(3), iterator.getString("root.sg1.d2.s1"));
-        assertEquals(retArray[count], ans);
+        StringBuilder ans = new StringBuilder();
+        ans.append(iterator.getLong(1)).append(",").append(iterator.getBoolean(2)).append(",")
+            .append(iterator.getInt(3)).append(",").append(iterator.getLong(4)).append(",")
+            .append(iterator.getFloat(5)).append(",").append(iterator.getDouble(6)).append(",")
+            .append(iterator.getString(7));
+        assertEquals(retArray[count], ans.toString());
+        count++;
+      }
+      assertEquals(retArray.length, count);
+      sessionDataSet.closeOperationHandle();
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  /**
+   * Test getBoolean(), getInt(), getLong(), getFloat(), getDouble(), getString() by columnName
+   */
+  @Test
+  public void testGetValueByColumnName() {
+    String[] retArray = new String[]{
+        "0,true,0,0,0.0,0.0,time0",
+        "1,false,1,10,1.5,2.5,time1",
+        "2,true,2,20,3.0,5.0,time2",
+        "3,false,3,30,4.5,7.5,time3",
+        "4,true,4,40,6.0,10.0,time4",
+        "5,false,5,50,7.5,12.5,time5",
+        "6,true,6,60,9.0,15.0,time6",
+        "7,false,7,70,10.5,17.5,time7",
+        "8,true,8,80,12.0,20.0,time8",
+        "9,false,9,90,13.5,22.5,time9",
+    };
+
+    try {
+      SessionDataSet sessionDataSet = session.executeQueryStatement("select * from root.sg1.d1");
+      sessionDataSet.setFetchSize(1024);
+      DataIterator iterator = sessionDataSet.iterator();
+      int count = 0;
+      while (iterator.next()) {
+        StringBuilder ans = new StringBuilder();
+        ans.append(iterator.getLong("Time")).append(",")
+            .append(iterator.getBoolean("root.sg1.d1.s1")).append(",")
+            .append(iterator.getInt("root.sg1.d1.s2")).append(",")
+            .append(iterator.getLong("root.sg1.d1.s3")).append(",")
+            .append(iterator.getFloat("root.sg1.d1.s4")).append(",")
+            .append(iterator.getDouble("root.sg1.d1.s5")).append(",")
+            .append(iterator.getString("root.sg1.d1.s6"));
+        assertEquals(retArray[count], ans.toString());
+        count++;
+      }
+      assertEquals(retArray.length, count);
+      sessionDataSet.closeOperationHandle();
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  /**
+   * Test getObject() by columnIndex.
+   */
+  @Test
+  public void testGetObjectByColumnName() {
+    String[] retArray = new String[]{
+        "0,true,0,0,0.0,0.0,time0",
+        "1,false,1,10,1.5,2.5,time1",
+        "2,true,2,20,3.0,5.0,time2",
+        "3,false,3,30,4.5,7.5,time3",
+        "4,true,4,40,6.0,10.0,time4",
+        "5,false,5,50,7.5,12.5,time5",
+        "6,true,6,60,9.0,15.0,time6",
+        "7,false,7,70,10.5,17.5,time7",
+        "8,true,8,80,12.0,20.0,time8",
+        "9,false,9,90,13.5,22.5,time9",
+    };
+
+    try {
+      SessionDataSet sessionDataSet = session
+          .executeQueryStatement("select s1,s2,s3,s4,s5,s6 from root.sg1.d1");
+      sessionDataSet.setFetchSize(1024);
+      DataIterator iterator = sessionDataSet.iterator();
+      int count = 0;
+      while (iterator.next()) {
+        StringBuilder ans = new StringBuilder();
+        long time = (long) iterator.getObject(1);
+        boolean s1 = (boolean) iterator.getObject(2);
+        int s2 = (int) iterator.getObject(3);
+        long s3 = (long) iterator.getObject(4);
+        float s4 = (float) iterator.getObject(5);
+        double s5 = (double) iterator.getObject(6);
+        String s6 = (String) iterator.getObject(7);
+        ans.append(time).append(",").append(s1).append(",").append(s2).append(",").append(s3)
+            .append(",").append(s4).append(",").append(s5).append(",").append(s6);
+        assertEquals(retArray[count], ans.toString());
         count++;
       }
       assertEquals(retArray.length, count);
@@ -87,16 +184,21 @@ public class IoTDBSessionIteratorIT {
     }
   }
 
+
   @Test
-  public void test2() {
+  public void testLastQuery() {
     String[] retArray = new String[]{
-        "9,root.sg1.d1.s1,1",
-        "9,root.sg1.d1.s2,2.0",
-        "9,root.sg1.d2.s1,4.0"
+        "9,root.sg1.d1.s1,false",
+        "9,root.sg1.d1.s2,9",
+        "9,root.sg1.d1.s3,90",
+        "9,root.sg1.d1.s4,13.5",
+        "9,root.sg1.d1.s5,22.5",
+        "9,root.sg1.d1.s6,time9",
     };
 
     try {
-      SessionDataSet sessionDataSet = session.executeQueryStatement("select last * from root.sg1");
+      SessionDataSet sessionDataSet = session
+          .executeQueryStatement("select last s1,s2,s3,s4,s5,s6 from root.sg1.d1");
       sessionDataSet.setFetchSize(1024);
       DataIterator iterator = sessionDataSet.iterator();
       int count = 0;
@@ -115,7 +217,7 @@ public class IoTDBSessionIteratorIT {
   }
 
   @Test
-  public void test3() {
+  public void testShowDevices() {
     String[] retArray = new String[]{
         "root.sg1.d1",
         "root.sg1.d2"
@@ -145,24 +247,36 @@ public class IoTDBSessionIteratorIT {
     session.open();
 
     session.setStorageGroup("root.sg1");
-    session.createTimeseries("root.sg1.d1.s1", TSDataType.INT32, TSEncoding.RLE,
+    session.createTimeseries("root.sg1.d1.s1", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+        CompressionType.SNAPPY);
+    session.createTimeseries("root.sg1.d1.s2", TSDataType.INT32, TSEncoding.PLAIN,
         CompressionType.SNAPPY);
-    session.createTimeseries("root.sg1.d1.s2", TSDataType.FLOAT, TSEncoding.RLE,
+    session.createTimeseries("root.sg1.d1.s3", TSDataType.INT64, TSEncoding.PLAIN,
         CompressionType.SNAPPY);
-    session.createTimeseries("root.sg1.d2.s1", TSDataType.DOUBLE, TSEncoding.RLE,
+    session.createTimeseries("root.sg1.d1.s4", TSDataType.FLOAT, TSEncoding.PLAIN,
+        CompressionType.SNAPPY);
+    session.createTimeseries("root.sg1.d1.s5", TSDataType.DOUBLE, TSEncoding.PLAIN,
+        CompressionType.SNAPPY);
+    session.createTimeseries("root.sg1.d1.s6", TSDataType.TEXT, TSEncoding.PLAIN,
+        CompressionType.SNAPPY);
+    session.createTimeseries("root.sg1.d2.s1", TSDataType.BOOLEAN, TSEncoding.PLAIN,
         CompressionType.SNAPPY);
     String deviceId = "root.sg1.d1";
     List<String> measurements = new ArrayList<>();
     List<TSDataType> types = new ArrayList<>();
-    measurements.add("s1");
-    measurements.add("s2");
-    types.add(TSDataType.INT32);
-    types.add(TSDataType.FLOAT);
+    for (int i = 1; i <= 6; i++) {
+      measurements.add("s" + i);
+      types.add(TSDataType.deserialize((short) (i - 1)));
+    }
 
     for (long time = 0; time < 10; time++) {
       List<Object> values = new ArrayList<>();
-      values.add(1);
-      values.add(2f);
+      values.add((time % 2) == 0);
+      values.add((int) time);
+      values.add(time * 10);
+      values.add(time * 1.5f);
+      values.add(time * 2.5);
+      values.add("time" + time);
       session.insertRecord(deviceId, time, measurements, types, values);
     }
 
@@ -170,11 +284,11 @@ public class IoTDBSessionIteratorIT {
     measurements = new ArrayList<>();
     types = new ArrayList<>();
     measurements.add("s1");
-    types.add(TSDataType.DOUBLE);
+    types.add(TSDataType.BOOLEAN);
 
     for (long time = 5; time < 10; time++) {
       List<Object> values = new ArrayList<>();
-      values.add(4d);
+      values.add((time % 2) == 0);
       session.insertRecord(deviceId, time, measurements, types, values);
     }
   }