This is an automated email from the ASF dual-hosted git repository.
rong pushed a commit to branch convert-on-type-mismatch
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/convert-on-type-mismatch by
this push:
new cd14f43a8e7 refactor
cd14f43a8e7 is described below
commit cd14f43a8e7f3a02cb36a48a63a0a30f8dfa0acc
Author: Steve Yurong Su <[email protected]>
AuthorDate: Wed Aug 7 19:21:01 2024 +0800
refactor
---
.../protocol/thrift/IoTDBDataNodeReceiver.java | 18 ++++------
...peStatementDataTypeConvertExecutionVisitor.java | 38 ++++++++++++----------
2 files changed, 27 insertions(+), 29 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
index 62bcabd1a56..b70f833a7c5 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
@@ -486,23 +486,17 @@ public class IoTDBDataNodeReceiver extends
IoTDBFileReceiver {
}
}
- private TSStatus executeStatementWithRetryOnDataTypeMismatch(final Statement
statement)
- throws Exception {
+ private TSStatus executeStatementWithRetryOnDataTypeMismatch(final Statement
statement) {
if (statement == null) {
return RpcUtils.getStatus(
TSStatusCode.PIPE_TRANSFER_EXECUTE_STATEMENT_ERROR, "Execute null
statement.");
}
- try {
- return executeStatement(statement);
- } catch (final Exception e) {
- if (!shouldConvertDataTypeOnTypeMismatch) {
- throw e;
- }
- return statement
- .accept(STATEMENT_DATA_TYPE_CONVERT_EXECUTION_VISITOR, e)
- .orElseThrow(() -> e);
- }
+ final TSStatus status = executeStatement(statement);
+ return status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()
+ || !shouldConvertDataTypeOnTypeMismatch
+ ? status
+ : statement.accept(STATEMENT_DATA_TYPE_CONVERT_EXECUTION_VISITOR,
status).orElse(status);
}
private static TSStatus executeStatement(final Statement statement) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementDataTypeConvertExecutionVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementDataTypeConvertExecutionVisitor.java
index 7db2812efc1..bf074ce8bff 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementDataTypeConvertExecutionVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/visitor/PipeStatementDataTypeConvertExecutionVisitor.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.db.pipe.receiver.visitor;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.db.exception.metadata.DataTypeMismatchException;
import
org.apache.iotdb.db.pipe.receiver.transform.statement.PipeConvertedInsertRowStatement;
import
org.apache.iotdb.db.pipe.receiver.transform.statement.PipeConvertedInsertTabletStatement;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
@@ -31,6 +32,7 @@ import
org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowsOfOneDevice
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowsStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement;
import org.apache.iotdb.db.queryengine.plan.statement.crud.LoadTsFileStatement;
+import org.apache.iotdb.rpc.TSStatusCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +45,7 @@ import java.util.stream.Collectors;
* exception occurs. The transformed statement (if any) is returned and will
be executed again.
*/
public class PipeStatementDataTypeConvertExecutionVisitor
- extends StatementVisitor<Optional<TSStatus>, Exception> {
+ extends StatementVisitor<Optional<TSStatus>, TSStatus> {
private static final Logger LOGGER =
LoggerFactory.getLogger(PipeStatementDataTypeConvertExecutionVisitor.class);
@@ -69,30 +71,31 @@ public class PipeStatementDataTypeConvertExecutionVisitor
}
@Override
- public Optional<TSStatus> visitNode(
- final StatementNode statementNode, final Exception exception) {
+ public Optional<TSStatus> visitNode(final StatementNode statementNode, final
TSStatus status) {
return Optional.empty();
}
@Override
public Optional<TSStatus> visitLoadFile(
- final LoadTsFileStatement loadTsFileStatement, final Exception
exception) {
+ final LoadTsFileStatement loadTsFileStatement, final TSStatus status) {
// TODO: judge if the exception is caused by data type mismatch
// TODO: convert the data type of the statement
- return visitStatement(loadTsFileStatement, exception);
+ return visitStatement(loadTsFileStatement, status);
}
@Override
public Optional<TSStatus> visitInsertRow(
- final InsertRowStatement insertRowStatement, final Exception exception) {
- // TODO: judge if the exception is caused by data type mismatch
-
- return tryExecute(new PipeConvertedInsertRowStatement(insertRowStatement));
+ final InsertRowStatement insertRowStatement, final TSStatus status) {
+ return status.getCode() == TSStatusCode.METADATA_ERROR.getStatusCode()
+ && status.getMessage() != null
+ &&
status.getMessage().contains(DataTypeMismatchException.REGISTERED_TYPE_STRING)
+ ? tryExecute(new PipeConvertedInsertRowStatement(insertRowStatement))
+ : Optional.empty();
}
@Override
public Optional<TSStatus> visitInsertRows(
- final InsertRowsStatement insertRowsStatement, final Exception
exception) {
+ final InsertRowsStatement insertRowsStatement, final TSStatus status) {
// TODO: judge if the exception is caused by data type mismatch
if (insertRowsStatement.getInsertRowStatementList() == null
@@ -110,8 +113,7 @@ public class PipeStatementDataTypeConvertExecutionVisitor
@Override
public Optional<TSStatus> visitInsertRowsOfOneDevice(
- final InsertRowsOfOneDeviceStatement insertRowsOfOneDeviceStatement,
- final Exception exception) {
+ final InsertRowsOfOneDeviceStatement insertRowsOfOneDeviceStatement,
final TSStatus status) {
// TODO: judge if the exception is caused by data type mismatch
if (insertRowsOfOneDeviceStatement.getInsertRowStatementList() == null
@@ -130,15 +132,17 @@ public class PipeStatementDataTypeConvertExecutionVisitor
@Override
public Optional<TSStatus> visitInsertTablet(
- final InsertTabletStatement insertTabletStatement, final Exception
exception) {
- // TODO: judge if the exception is caused by data type mismatch
-
- return tryExecute(new
PipeConvertedInsertTabletStatement(insertTabletStatement));
+ final InsertTabletStatement insertTabletStatement, final TSStatus
status) {
+ return status.getCode() == TSStatusCode.METADATA_ERROR.getStatusCode()
+ && status.getMessage() != null
+ &&
status.getMessage().contains(DataTypeMismatchException.REGISTERED_TYPE_STRING)
+ ? tryExecute(new
PipeConvertedInsertTabletStatement(insertTabletStatement))
+ : Optional.empty();
}
@Override
public Optional<TSStatus> visitInsertMultiTablets(
- final InsertMultiTabletsStatement insertMultiTabletsStatement, final
Exception exception) {
+ final InsertMultiTabletsStatement insertMultiTabletsStatement, final
TSStatus status) {
// TODO: judge if the exception is caused by data type mismatch
if (insertMultiTabletsStatement.getInsertTabletStatementList() == null