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

Reply via email to