This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 29adcf6 [IOTDB-615] fix infer type from session (#1282)
29adcf6 is described below
commit 29adcf648be1792bfac54987cfeb2b35b06008e2
Author: Jialin Qiao <[email protected]>
AuthorDate: Thu May 28 23:07:56 2020 +0800
[IOTDB-615] fix infer type from session (#1282)
* fix infer type from session
---
.../main/java/org/apache/iotdb/SessionExample.java | 16 ++++++++++
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 13 +++-----
.../iotdb/db/qp/physical/crud/InsertPlan.java | 34 +++++++++++---------
.../org/apache/iotdb/db/service/TSServiceImpl.java | 2 ++
.../apache/iotdb/db/utils/TypeInferenceUtils.java | 8 ++---
.../iotdb/db/writelog/recover/LogReplayer.java | 2 +-
.../iotdb/db/engine/storagegroup/TTLTest.java | 4 +--
.../iotdb/db/utils/TypeInferenceUtilsTest.java | 19 ++++++++++--
service-rpc/src/main/thrift/rpc.thrift | 2 ++
.../java/org/apache/iotdb/session/Session.java | 2 ++
.../org/apache/iotdb/session/SessionDataSet.java | 10 ++++--
.../org/apache/iotdb/session/IoTDBSessionIT.java | 36 ++++++++++++----------
12 files changed, 96 insertions(+), 52 deletions(-)
diff --git a/example/session/src/main/java/org/apache/iotdb/SessionExample.java
b/example/session/src/main/java/org/apache/iotdb/SessionExample.java
index f7e7db9..01b05e5 100644
--- a/example/session/src/main/java/org/apache/iotdb/SessionExample.java
+++ b/example/session/src/main/java/org/apache/iotdb/SessionExample.java
@@ -153,6 +153,22 @@ public class SessionExample {
}
}
+ private static void insertStrRecord() throws IoTDBConnectionException,
StatementExecutionException {
+ String deviceId = "root.sg1.d1";
+ List<String> measurements = new ArrayList<>();
+ measurements.add("s1");
+ measurements.add("s2");
+ measurements.add("s3");
+
+ for (long time = 0; time < 10; time++) {
+ List<String> values = new ArrayList<>();
+ values.add("1");
+ values.add("2");
+ values.add("3");
+ session.insertRecord(deviceId, time, measurements, values);
+ }
+ }
+
private static void insertRecordInObject()
throws IoTDBConnectionException, StatementExecutionException {
String deviceId = "root.sg1.d1";
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 ca9c13b..899b486 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
@@ -877,13 +877,8 @@ public class PlanExecutor implements IPlanExecutor {
if
(!IoTDBDescriptor.getInstance().getConfig().isAutoCreateSchemaEnabled()) {
throw new PathNotExistException(deviceId + PATH_SEPARATOR +
measurement);
}
- TSDataType dataType;
- if (insertPlan.getStrValues() != null) {
- // infer type for insert sql
- dataType =
TypeInferenceUtils.getPredictedDataType(insertPlan.getStrValues()[i]);
- } else {
- dataType =
TypeInferenceUtils.getPredictedDataType(insertPlan.getValues()[i]);
- }
+ TSDataType dataType = TypeInferenceUtils
+ .getPredictedDataType(insertPlan.getValues()[i],
insertPlan.isInferType());
Path path = new Path(deviceId, measurement);
internalCreateTimeseries(path.toString(), dataType);
}
@@ -892,13 +887,13 @@ public class PlanExecutor implements IPlanExecutor {
// reset measurement to common name instead of alias
measurementList[i] = measurementNode.getName();
- if(insertPlan.getStrValues() == null) {
+ if(!insertPlan.isInferType()) {
checkType(insertPlan, i, measurementNode.getSchema().getType());
}
}
insertPlan.setMeasurements(measurementList);
- insertPlan.setSchemas(schemas);
+ insertPlan.setSchemasAndTransferType(schemas);
StorageEngine.getInstance().insert(insertPlan);
} catch (StorageEngineException | MetadataException e) {
throw new QueryProcessException(e);
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
index b2c2c2a..116ca7a 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
@@ -50,16 +50,10 @@ public class InsertPlan extends PhysicalPlan {
private TSDataType[] types;
private MeasurementSchema[] schemas;
- public String[] getStrValues() {
- return strValues;
- }
-
- public void setStrValues(String[] strValues) {
- this.strValues = strValues;
- }
+ // if inferType is false, use the type of values directly
+ // if inferType is true, values is String[], and infer types from them
+ private boolean inferType = false;
- // only for sql
- private String[] strValues;
public InsertPlan() {
super(false, OperatorType.INSERT);
@@ -140,7 +134,8 @@ public class InsertPlan extends PhysicalPlan {
// build types and values
this.types = new TSDataType[measurements.length];
this.values = new Object[measurements.length];
- this.strValues = insertValues;
+ System.arraycopy(insertValues, 0, values, 0, measurements.length);
+ inferType = true;
canbeSplit = false;
}
@@ -153,18 +148,29 @@ public class InsertPlan extends PhysicalPlan {
this.time = time;
}
+ public boolean isInferType() {
+ return inferType;
+ }
+
+ public void setInferType(boolean inferType) {
+ this.inferType = inferType;
+ }
+
public MeasurementSchema[] getSchemas() {
return schemas;
}
- public void setSchemas(MeasurementSchema[] schemas) throws
QueryProcessException {
+ /**
+ * if inferType is true,
+ * transfer String[] values to specific data types (Integer, Long, Float,
Double, Binary)
+ */
+ public void setSchemasAndTransferType(MeasurementSchema[] schemas) throws
QueryProcessException {
this.schemas = schemas;
- if (strValues != null) {
+ if (inferType) {
for (int i = 0; i < schemas.length; i++) {
types[i] = schemas[i].getType();
- values[i] = CommonUtils.parseValue(types[i], strValues[i]);
+ values[i] = CommonUtils.parseValue(types[i], values[i].toString());
}
- strValues = null;
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index fef8785..9d7c505 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -1076,6 +1076,7 @@ public class TSServiceImpl implements TSIService.Iface,
ServerContext {
plan.setTypes(new TSDataType[plan.getMeasurements().length]);
plan.setValues(new Object[plan.getMeasurements().length]);
plan.setValues(req.valuesList.get(i));
+ plan.setInferType(req.isInferType());
TSStatus status = checkAuthority(plan, req.getSessionId());
if (status != null) {
resp.addToStatusList(status);
@@ -1124,6 +1125,7 @@ public class TSServiceImpl implements TSIService.Iface,
ServerContext {
plan.setTypes(new TSDataType[plan.getMeasurements().length]);
plan.setValues(new Object[plan.getMeasurements().length]);
plan.setValues(req.values);
+ plan.setInferType(req.isInferType());
TSStatus status = checkAuthority(plan, req.getSessionId());
if (status != null) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
b/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
index 9e2bba1..2e9981d 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/TypeInferenceUtils.java
@@ -53,10 +53,10 @@ public class TypeInferenceUtils {
/**
* Get predicted DataType of the given value
*/
- public static TSDataType getPredictedDataType(Object value) {
+ public static TSDataType getPredictedDataType(Object value, boolean
inferType) {
- if (value instanceof String) {
- String strValue = (String) value;
+ if (inferType) {
+ String strValue = value.toString();
if (isBoolean(strValue)) {
return booleanStringInferType;
} else if (isNumber(strValue)){
@@ -78,8 +78,6 @@ public class TypeInferenceUtils {
return TSDataType.FLOAT;
} else if (value instanceof Double) {
return TSDataType.DOUBLE;
- } else if (value instanceof Binary) {
- return TSDataType.TEXT;
}
return TSDataType.TEXT;
diff --git
a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
index 0f32e8e..b5574a4 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
@@ -172,7 +172,7 @@ public class LogReplayer {
try {
MeasurementSchema[] schemas =
MManager.getInstance().getSchemas(insertPlan.getDeviceId(),
insertPlan.getMeasurements());
- insertPlan.setSchemas(schemas);
+ insertPlan.setSchemasAndTransferType(schemas);
recoverMemTable.insert(insertPlan);
} catch (Exception e) {
logger.error(
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
index 3023367..a48e969 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
@@ -133,7 +133,7 @@ public class TTLTest {
insertPlan.setMeasurements(new String[]{"s1"});
insertPlan.setTypes(new TSDataType[]{TSDataType.INT64});
insertPlan.setValues(new Object[]{1L});
- insertPlan.setSchemas(
+ insertPlan.setSchemasAndTransferType(
new MeasurementSchema[]{new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.PLAIN)});
// ok without ttl
@@ -160,7 +160,7 @@ public class TTLTest {
insertPlan.setMeasurements(new String[]{"s1"});
insertPlan.setTypes(new TSDataType[]{TSDataType.INT64});
insertPlan.setValues(new Object[]{1L});
- insertPlan.setSchemas(
+ insertPlan.setSchemasAndTransferType(
new MeasurementSchema[]{new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.PLAIN)});
long initTime = System.currentTimeMillis();
diff --git
a/server/src/test/java/org/apache/iotdb/db/utils/TypeInferenceUtilsTest.java
b/server/src/test/java/org/apache/iotdb/db/utils/TypeInferenceUtilsTest.java
index 69b4e5c..267bafc 100644
--- a/server/src/test/java/org/apache/iotdb/db/utils/TypeInferenceUtilsTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/utils/TypeInferenceUtilsTest.java
@@ -42,9 +42,10 @@ public class TypeInferenceUtilsTest {
}
@Test
- public void getPredictedDataTypeTest() {
+ public void testInferType() {
Object[] values = {123, "abc", 123.123d, true, 123.1f, "123", "12.2",
"true"};
- TSDataType[] encodings = {TSDataType.INT32, TSDataType.TEXT,
TSDataType.DOUBLE,
+ TSDataType[] encodings =
{IoTDBDescriptor.getInstance().getConfig().getIntegerStringInferType(),
+ TSDataType.TEXT,
IoTDBDescriptor.getInstance().getConfig().getFloatingStringInferType(),
TSDataType.BOOLEAN, TSDataType.FLOAT,
IoTDBDescriptor.getInstance().getConfig().getIntegerStringInferType(),
IoTDBDescriptor.getInstance().getConfig().getFloatingStringInferType(),
@@ -52,7 +53,19 @@ public class TypeInferenceUtilsTest {
};
for (int i = 0; i < values.length; i++) {
- assertEquals(encodings[i],
TypeInferenceUtils.getPredictedDataType(values[i]));
+ assertEquals(encodings[i],
TypeInferenceUtils.getPredictedDataType(values[i], true));
+ }
+ }
+
+ @Test
+ public void testNotInferType() {
+ Object[] values = {123, "abc", 123.123d, true, 123.1f, "123", "12.2",
"true"};
+ TSDataType[] encodings = {TSDataType.INT32, TSDataType.TEXT,
TSDataType.DOUBLE,
+ TSDataType.BOOLEAN, TSDataType.FLOAT, TSDataType.TEXT,
TSDataType.TEXT, TSDataType.TEXT
+ };
+
+ for (int i = 0; i < values.length; i++) {
+ assertEquals(encodings[i],
TypeInferenceUtils.getPredictedDataType(values[i], false));
}
}
}
diff --git a/service-rpc/src/main/thrift/rpc.thrift
b/service-rpc/src/main/thrift/rpc.thrift
index 876dac4..0073669 100644
--- a/service-rpc/src/main/thrift/rpc.thrift
+++ b/service-rpc/src/main/thrift/rpc.thrift
@@ -171,6 +171,7 @@ struct TSInsertRecordReq {
3: required list<string> measurements
4: required binary values
5: required i64 timestamp
+ 6: optional bool inferType
}
struct TSInsertTabletReq {
@@ -199,6 +200,7 @@ struct TSInsertRecordsReq {
3: required list<list<string>> measurementsList
4: required list<binary> valuesList
5: required list<i64> timestamps
+ 6: optional bool inferType
}
struct TSDeleteDataReq {
diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java
b/session/src/main/java/org/apache/iotdb/session/Session.java
index 244b602..f3e36ae 100644
--- a/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -375,6 +375,7 @@ public class Session {
request.setDeviceIds(deviceIds);
request.setTimestamps(times);
request.setMeasurementsList(measurementsList);
+ request.setInferType(true);
List<ByteBuffer> buffersList = new ArrayList<>();
for (int i = 0; i < measurementsList.size(); i++) {
ByteBuffer buffer =
ByteBuffer.allocate(calculateStrLength(valuesList.get(i)));
@@ -433,6 +434,7 @@ public class Session {
request.setDeviceId(deviceId);
request.setTimestamp(time);
request.setMeasurements(measurements);
+ request.setInferType(true);
ByteBuffer buffer = ByteBuffer.allocate(calculateStrLength(values));
putStrValues(values, buffer);
buffer.flip();
diff --git a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
index bc60c5b..b1708f8 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
@@ -76,11 +76,17 @@ public class SessionDataSet {
for (int i = 0; i < ioTDBRpcDataSet.columnSize; i++) {
Field field;
+ int index = i + 1;
+ int datasetColumnIndex = i + START_INDEX;
+ if (ioTDBRpcDataSet.ignoreTimeStamp) {
+ index--;
+ datasetColumnIndex--;
+ }
int loc =
-
ioTDBRpcDataSet.columnOrdinalMap.get(ioTDBRpcDataSet.columnNameList.get(i + 1))
+
ioTDBRpcDataSet.columnOrdinalMap.get(ioTDBRpcDataSet.columnNameList.get(index))
- START_INDEX;
- if (!ioTDBRpcDataSet.isNull(i + START_INDEX)) {
+ if (!ioTDBRpcDataSet.isNull(datasetColumnIndex)) {
byte[] valueBytes = ioTDBRpcDataSet.values[loc];
TSDataType dataType =
ioTDBRpcDataSet.columnTypeDeduplicatedList.get(loc);
field = new Field(dataType);
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
index 8097e37..a6c197e 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
@@ -44,6 +44,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.Field;
+import org.apache.iotdb.tsfile.read.common.RowRecord;
import org.apache.iotdb.tsfile.write.record.Tablet;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
import org.junit.After;
@@ -90,6 +91,25 @@ public class IoTDBSessionIT {
}
+ private void insertByStr() throws IoTDBConnectionException,
StatementExecutionException {
+ String deviceId = "root.sg1.d1";
+ List<String> measurements = new ArrayList<>();
+ measurements.add("s1");
+ measurements.add("s2");
+ measurements.add("s3");
+
+ for (long time = 0; time < 100; time++) {
+ List<String> values = new ArrayList<>();
+ values.add("1");
+ values.add("2");
+ values.add("3");
+ session.insertRecord(deviceId, time, measurements, values);
+ }
+
+ SessionDataSet dataSet = session.executeQueryStatement("show timeseries
root");
+ assertTrue(dataSet.hasNext());
+ RowRecord record = dataSet.next();
+ }
@Test
public void testInsertByObject() throws IoTDBConnectionException,
StatementExecutionException {
@@ -676,22 +696,6 @@ public class IoTDBSessionIT {
}
}
- private void insertByStr() throws IoTDBConnectionException,
StatementExecutionException {
- String deviceId = "root.sg1.d1";
- List<String> measurements = new ArrayList<>();
- measurements.add("s1");
- measurements.add("s2");
- measurements.add("s3");
-
- for (long time = 0; time < 100; time++) {
- List<String> values = new ArrayList<>();
- values.add("1");
- values.add("2");
- values.add("3");
- session.insertRecord(deviceId, time, measurements, values);
- }
- }
-
private void insertTabletTest1(String deviceId)
throws IoTDBConnectionException, BatchExecutionException {