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);
}
}