You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2023/07/06 15:48:30 UTC

[iotdb] branch master updated: [ISSUE-10109] Fixed data column and data correspondence mismatch returned by the rest API interface (#10453)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a70cb201df [ISSUE-10109] Fixed data column and data correspondence mismatch returned by the rest API interface (#10453)
5a70cb201df is described below

commit 5a70cb201dfade8a53fd4bd311fa1abc9bea8c71
Author: CloudWise-Lukemiao <76...@users.noreply.github.com>
AuthorDate: Thu Jul 6 23:48:22 2023 +0800

    [ISSUE-10109] Fixed data column and data correspondence mismatch returned by the rest API interface (#10453)
    
    Co-authored-by: Cloudwise_Luke <28...@qq.com>
---
 .../rest/v1/handler/QueryDataSetHandler.java        | 21 +++++++++++++++------
 .../rest/v2/handler/QueryDataSetHandler.java        | 21 +++++++++++++++------
 2 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java
index 01ec4caf470..221c4f4ec3a 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/handler/QueryDataSetHandler.java
@@ -87,32 +87,40 @@ public class QueryDataSetHandler {
         new org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet();
 
     DatasetHeader datasetHeader = queryExecution.getDatasetHeader();
-
+    int[] targetDataSetIndexToSourceDataSetIndex = new int[datasetHeader.getRespColumns().size()];
     for (int i = 0; i < datasetHeader.getRespColumns().size(); i++) {
       targetDataSet.addExpressionsItem(datasetHeader.getRespColumns().get(i));
       targetDataSet.addValuesItem(new ArrayList<>());
+      targetDataSetIndexToSourceDataSetIndex[i] =
+          datasetHeader.getColumnNameIndexMap().get(datasetHeader.getRespColumns().get(i));
     }
 
-    return fillQueryDataSetWithoutTimestamps(queryExecution, actualRowSizeLimit, targetDataSet);
+    return fillQueryDataSetWithoutTimestamps(
+        queryExecution, targetDataSetIndexToSourceDataSetIndex, actualRowSizeLimit, targetDataSet);
   }
 
   private static Response fillShowPlanDataSet(
       IQueryExecution queryExecution, final int actualRowSizeLimit) throws IoTDBException {
     org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet =
         new org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet();
+    int[] targetDataSetIndexToSourceDataSetIndex =
+        new int[queryExecution.getDatasetHeader().getRespColumns().size()];
     initTargetDatasetOrderByOrderWithSourceDataSet(
-        queryExecution.getDatasetHeader(), targetDataSet);
+        queryExecution.getDatasetHeader(), targetDataSetIndexToSourceDataSetIndex, targetDataSet);
 
-    return fillQueryDataSetWithoutTimestamps(queryExecution, actualRowSizeLimit, targetDataSet);
+    return fillQueryDataSetWithoutTimestamps(
+        queryExecution, targetDataSetIndexToSourceDataSetIndex, actualRowSizeLimit, targetDataSet);
   }
 
   private static void initTargetDatasetOrderByOrderWithSourceDataSet(
       DatasetHeader datasetHeader,
+      int[] targetDataSetIndexToSourceDataSetIndex,
       org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet) {
     if (datasetHeader.getRespColumns() != null) {
       for (int i = 0; i < datasetHeader.getRespColumns().size(); i++) {
         targetDataSet.addColumnNamesItem(datasetHeader.getRespColumns().get(i));
         targetDataSet.addValuesItem(new ArrayList<>());
+        targetDataSetIndexToSourceDataSetIndex[i] = i;
       }
     }
   }
@@ -147,7 +155,7 @@ public class QueryDataSetHandler {
             .build();
       }
       Optional<TsBlock> optionalTsBlock = queryExecution.getBatchResult();
-      if (!optionalTsBlock.isPresent()) {
+      if (!optionalTsBlock.isPresent() || optionalTsBlock.get().isEmpty()) {
         if (fetched == 0) {
           targetDataSet.setTimestamps(new ArrayList<>());
           targetDataSet.setValues(new ArrayList<>());
@@ -188,6 +196,7 @@ public class QueryDataSetHandler {
 
   private static Response fillQueryDataSetWithoutTimestamps(
       IQueryExecution queryExecution,
+      int[] targetDataSetIndexToSourceDataSetIndex,
       int actualRowSizeLimit,
       org.apache.iotdb.db.protocol.rest.v1.model.QueryDataSet targetDataSet)
       throws IoTDBException {
@@ -220,7 +229,7 @@ public class QueryDataSetHandler {
         return Response.ok().entity(targetDataSet).build();
       }
       for (int k = 0; k < columnNum; k++) {
-        Column column = tsBlock.getColumn(k);
+        Column column = tsBlock.getColumn(targetDataSetIndexToSourceDataSetIndex[k]);
         List<Object> targetDataSetColumn = targetDataSet.getValues().get(k);
         for (int i = 0; i < currentCount; i++) {
           fetched++;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java
index 5fb7cb8b01e..5b3b48faf20 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/handler/QueryDataSetHandler.java
@@ -87,32 +87,40 @@ public class QueryDataSetHandler {
         new org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet();
 
     DatasetHeader datasetHeader = queryExecution.getDatasetHeader();
-
+    int[] targetDataSetIndexToSourceDataSetIndex = new int[datasetHeader.getRespColumns().size()];
     for (int i = 0; i < datasetHeader.getRespColumns().size(); i++) {
       targetDataSet.addExpressionsItem(datasetHeader.getRespColumns().get(i));
       targetDataSet.addValuesItem(new ArrayList<>());
+      targetDataSetIndexToSourceDataSetIndex[i] =
+          datasetHeader.getColumnNameIndexMap().get(datasetHeader.getRespColumns().get(i));
     }
 
-    return fillQueryDataSetWithoutTimestamps(queryExecution, actualRowSizeLimit, targetDataSet);
+    return fillQueryDataSetWithoutTimestamps(
+        queryExecution, targetDataSetIndexToSourceDataSetIndex, actualRowSizeLimit, targetDataSet);
   }
 
   private static Response fillShowPlanDataSet(
       IQueryExecution queryExecution, final int actualRowSizeLimit) throws IoTDBException {
     org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet =
         new org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet();
+    int[] targetDataSetIndexToSourceDataSetIndex =
+        new int[queryExecution.getDatasetHeader().getRespColumns().size()];
     initTargetDatasetOrderByOrderWithSourceDataSet(
-        queryExecution.getDatasetHeader(), targetDataSet);
+        queryExecution.getDatasetHeader(), targetDataSetIndexToSourceDataSetIndex, targetDataSet);
 
-    return fillQueryDataSetWithoutTimestamps(queryExecution, actualRowSizeLimit, targetDataSet);
+    return fillQueryDataSetWithoutTimestamps(
+        queryExecution, targetDataSetIndexToSourceDataSetIndex, actualRowSizeLimit, targetDataSet);
   }
 
   private static void initTargetDatasetOrderByOrderWithSourceDataSet(
       DatasetHeader datasetHeader,
+      int[] targetDataSetIndexToSourceDataSetIndex,
       org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet) {
     if (datasetHeader.getRespColumns() != null) {
       for (int i = 0; i < datasetHeader.getRespColumns().size(); i++) {
         targetDataSet.addColumnNamesItem(datasetHeader.getRespColumns().get(i));
         targetDataSet.addValuesItem(new ArrayList<>());
+        targetDataSetIndexToSourceDataSetIndex[i] = i;
       }
     }
   }
@@ -147,7 +155,7 @@ public class QueryDataSetHandler {
             .build();
       }
       Optional<TsBlock> optionalTsBlock = queryExecution.getBatchResult();
-      if (!optionalTsBlock.isPresent()) {
+      if (!optionalTsBlock.isPresent() || optionalTsBlock.get().isEmpty()) {
         if (fetched == 0) {
           targetDataSet.setTimestamps(new ArrayList<>());
           targetDataSet.setValues(new ArrayList<>());
@@ -188,6 +196,7 @@ public class QueryDataSetHandler {
 
   private static Response fillQueryDataSetWithoutTimestamps(
       IQueryExecution queryExecution,
+      int[] targetDataSetIndexToSourceDataSetIndex,
       int actualRowSizeLimit,
       org.apache.iotdb.db.protocol.rest.v2.model.QueryDataSet targetDataSet)
       throws IoTDBException {
@@ -220,7 +229,7 @@ public class QueryDataSetHandler {
         return Response.ok().entity(targetDataSet).build();
       }
       for (int k = 0; k < columnNum; k++) {
-        Column column = tsBlock.getColumn(k);
+        Column column = tsBlock.getColumn(targetDataSetIndexToSourceDataSetIndex[k]);
         List<Object> targetDataSetColumn = targetDataSet.getValues().get(k);
         for (int i = 0; i < currentCount; i++) {
           fetched++;