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