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

jackietien 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 f2e53d7  Fix query one sensor in a vector from memtable (#3056)
f2e53d7 is described below

commit f2e53d7d2dc30ac97b81930d3f41a791e17bacba
Author: Haonan <[email protected]>
AuthorDate: Sat Apr 24 13:58:28 2021 +0800

    Fix query one sensor in a vector from memtable (#3056)
    
    Fix query one sensor in a vector from memtable
---
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  11 ---
 .../db/engine/querycontext/ReadOnlyMemChunk.java   | 109 ++++++++++++++-------
 .../iotdb/db/query/reader/chunk/MemPageReader.java |  13 ++-
 3 files changed, 85 insertions(+), 48 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index 57e0e51..0eb04c8 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -315,17 +315,6 @@ public abstract class AbstractMemTable implements 
IMemTable {
       // get sorted tv list is synchronized so different query can get right 
sorted list reference
       TVList vectorTvListCopy = 
vectorMemChunk.getSortedTvListForQuery(columns);
       int curSize = vectorTvListCopy.size();
-      // return normal ReadOnlyMemChunk for query one measurement in vector
-      if (columns.size() == 1) {
-        return new ReadOnlyMemChunk(
-            measurementIdList.get(0),
-            partialVectorSchema.getValueTSDataTypeList().get(0),
-            partialVectorSchema.getValueTSEncodingList().get(0),
-            vectorTvListCopy,
-            null,
-            curSize,
-            deletionList);
-      }
       return new ReadOnlyMemChunk(partialVectorSchema, vectorTvListCopy, 
curSize, deletionList);
     } else {
       if (!checkPath(deviceId, measurement)) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
index 883fc00..d3b5029 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
@@ -186,41 +186,10 @@ public class ReadOnlyMemChunk {
       while (iterator.hasNextTimeValuePair()) {
         TimeValuePair timeValuePair = iterator.nextTimeValuePair();
         timeStatistics.update(timeValuePair.getTimestamp());
-        for (int i = 0; i < schema.getValueTSDataTypeList().size(); i++) {
-          if (timeValuePair.getValue().getVector()[i] == null) {
-            continue;
-          }
-          switch (schema.getValueTSDataTypeList().get(i)) {
-            case BOOLEAN:
-              valueStatistics[i].update(
-                  timeValuePair.getTimestamp(),
-                  timeValuePair.getValue().getVector()[i].getBoolean());
-              break;
-            case TEXT:
-              valueStatistics[i].update(
-                  timeValuePair.getTimestamp(),
-                  timeValuePair.getValue().getVector()[i].getBinary());
-              break;
-            case FLOAT:
-              valueStatistics[i].update(
-                  timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getFloat());
-              break;
-            case INT32:
-              valueStatistics[i].update(
-                  timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getInt());
-              break;
-            case INT64:
-              valueStatistics[i].update(
-                  timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getLong());
-              break;
-            case DOUBLE:
-              valueStatistics[i].update(
-                  timeValuePair.getTimestamp(),
-                  timeValuePair.getValue().getVector()[i].getDouble());
-              break;
-            default:
-              throw new QueryProcessException("Unsupported data type:" + 
dataType);
-          }
+        if (schema.getValueTSDataTypeList().size() == 1) {
+          updateValueStatisticsForSingleColumn(schema, valueStatistics, 
timeValuePair);
+        } else {
+          updateValueStatistics(schema, valueStatistics, timeValuePair);
         }
       }
     }
@@ -235,6 +204,76 @@ public class ReadOnlyMemChunk {
     cachedMetaData = vectorChunkMetadata;
   }
 
+  // When query one measurement in a Vector, the timeValuePair is not a vector 
type
+  private void updateValueStatisticsForSingleColumn(
+      IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair 
timeValuePair)
+      throws QueryProcessException {
+    switch (schema.getValueTSDataTypeList().get(0)) {
+      case BOOLEAN:
+        valueStatistics[0].update(
+            timeValuePair.getTimestamp(), 
timeValuePair.getValue().getBoolean());
+        break;
+      case TEXT:
+        valueStatistics[0].update(
+            timeValuePair.getTimestamp(), 
timeValuePair.getValue().getBinary());
+        break;
+      case FLOAT:
+        valueStatistics[0].update(
+            timeValuePair.getTimestamp(), timeValuePair.getValue().getFloat());
+        break;
+      case INT32:
+        valueStatistics[0].update(timeValuePair.getTimestamp(), 
timeValuePair.getValue().getInt());
+        break;
+      case INT64:
+        valueStatistics[0].update(timeValuePair.getTimestamp(), 
timeValuePair.getValue().getLong());
+        break;
+      case DOUBLE:
+        valueStatistics[0].update(
+            timeValuePair.getTimestamp(), 
timeValuePair.getValue().getDouble());
+        break;
+      default:
+        throw new QueryProcessException("Unsupported data type:" + dataType);
+    }
+  }
+
+  private void updateValueStatistics(
+      IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair 
timeValuePair)
+      throws QueryProcessException {
+    for (int i = 0; i < schema.getValueTSDataTypeList().size(); i++) {
+      if (timeValuePair.getValue().getVector()[i] == null) {
+        continue;
+      }
+      switch (schema.getValueTSDataTypeList().get(i)) {
+        case BOOLEAN:
+          valueStatistics[i].update(
+              timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getBoolean());
+          break;
+        case TEXT:
+          valueStatistics[i].update(
+              timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getBinary());
+          break;
+        case FLOAT:
+          valueStatistics[i].update(
+              timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getFloat());
+          break;
+        case INT32:
+          valueStatistics[i].update(
+              timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getInt());
+          break;
+        case INT64:
+          valueStatistics[i].update(
+              timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getLong());
+          break;
+        case DOUBLE:
+          valueStatistics[i].update(
+              timeValuePair.getTimestamp(), 
timeValuePair.getValue().getVector()[i].getDouble());
+          break;
+        default:
+          throw new QueryProcessException("Unsupported data type:" + dataType);
+      }
+    }
+  }
+
   public TSDataType getDataType() {
     return dataType;
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/MemPageReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/MemPageReader.java
index c4d8a09..f123ad7 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/MemPageReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/MemPageReader.java
@@ -19,6 +19,8 @@
 package org.apache.iotdb.db.query.reader.chunk;
 
 import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.VectorChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -45,8 +47,15 @@ public class MemPageReader implements IPageReader {
 
   @Override
   public BatchData getAllSatisfiedPageData(boolean ascending) throws 
IOException {
-    BatchData batchData =
-        BatchDataFactory.createBatchData(chunkMetadata.getDataType(), 
ascending, false);
+    TSDataType dataType;
+    if (chunkMetadata instanceof VectorChunkMetadata
+        && ((VectorChunkMetadata) 
chunkMetadata).getValueChunkMetadataList().size() == 1) {
+      dataType =
+          ((VectorChunkMetadata) 
chunkMetadata).getValueChunkMetadataList().get(0).getDataType();
+    } else {
+      dataType = chunkMetadata.getDataType();
+    }
+    BatchData batchData = BatchDataFactory.createBatchData(dataType, 
ascending, false);
     while (timeValuePairIterator.hasNextTimeValuePair()) {
       TimeValuePair timeValuePair = timeValuePairIterator.nextTimeValuePair();
       if (valueFilter == null

Reply via email to