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

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

commit ae1379e029c40146051b7f0d81887f6811008db9
Author: HTHou <[email protected]>
AuthorDate: Fri Nov 5 16:14:43 2021 +0800

    optimize query mem data
---
 .../engine/memtable/AlignedWritableMemChunk.java   |   9 +-
 .../querycontext/AlignedReadOnlyMemChunk.java      | 165 +++++++++++++++++++++
 .../db/engine/querycontext/ReadOnlyMemChunk.java   | 112 +-------------
 .../db/engine/storagegroup/TsFileProcessor.java    |   3 +-
 .../apache/iotdb/db/metadata/path/AlignedPath.java |   8 +-
 .../db/utils/datastructure/AlignedTVList.java      |  65 +++++---
 .../iotdb/db/utils/datastructure/TVList.java       |   2 +-
 7 files changed, 225 insertions(+), 139 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
index 90875a3..38e6e58 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
@@ -148,9 +148,11 @@ public class AlignedWritableMemChunk implements 
IWritableMemChunk {
     }
     for (int i = 0; i < measurementIdsInInsertPlan.size(); i++) {
       if (!containsMeasurement(measurementIdsInInsertPlan.get(i))) {
-        this.schema.addSubMeasurement(measurementIdsInInsertPlan.get(i), 
dataTypesInInsertPlan.get(i), encodingsInInsertPlan.get(i));
+        this.schema.addSubMeasurement(
+            measurementIdsInInsertPlan.get(i),
+            dataTypesInInsertPlan.get(i),
+            encodingsInInsertPlan.get(i));
         this.list.extendColumn(dataTypesInInsertPlan.get(i));
-        
       }
     }
     return columnIndexArray;
@@ -190,8 +192,7 @@ public class AlignedWritableMemChunk implements 
IWritableMemChunk {
     list.increaseReferenceCount();
     List<Integer> columnIndexList = new ArrayList<>();
     for (IMeasurementSchema measurementSchema : schemaList) {
-      columnIndexList.add(
-          schema.getSubMeasurementIndex(measurementSchema.getMeasurementId()));
+      
columnIndexList.add(schema.getSubMeasurementIndex(measurementSchema.getMeasurementId()));
     }
     return list.getTvListByColumnIndex(columnIndexList);
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/AlignedReadOnlyMemChunk.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/AlignedReadOnlyMemChunk.java
new file mode 100644
index 0000000..ddc1cc7
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/AlignedReadOnlyMemChunk.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.querycontext;
+
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.query.reader.chunk.MemChunkLoader;
+import org.apache.iotdb.db.utils.datastructure.AlignedTVList;
+import org.apache.iotdb.db.utils.datastructure.TVList;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+import org.apache.iotdb.tsfile.file.metadata.AlignedChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
+import org.apache.iotdb.tsfile.read.reader.IPointReader;
+import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
+import org.apache.iotdb.tsfile.write.schema.VectorMeasurementSchema;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AlignedReadOnlyMemChunk extends ReadOnlyMemChunk {
+
+  // deletion list for this chunk
+  private final List<TimeRange> deletionList;
+
+  private String measurementUid;
+  private TSDataType dataType;
+  private List<TSEncoding> encodingList;
+
+  private static final Logger logger = 
LoggerFactory.getLogger(AlignedReadOnlyMemChunk.class);
+
+  private int floatPrecision = 
TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
+
+  private AlignedTVList chunkData;
+
+  private int chunkDataSize;
+
+  /**
+   * The constructor for Aligned type.
+   *
+   * @param schema VectorMeasurementSchema
+   * @param tvList VectorTvList
+   * @param size The Number of Chunk data points
+   * @param deletionList The timeRange of deletionList
+   */
+  public AlignedReadOnlyMemChunk(
+      IMeasurementSchema schema, TVList tvList, int size, List<TimeRange> 
deletionList)
+      throws IOException, QueryProcessException {
+    super();
+    this.measurementUid = schema.getMeasurementId();
+    this.dataType = schema.getType();
+
+    this.encodingList = ((VectorMeasurementSchema) 
schema).getSubMeasurementsTSEncodingList();
+    this.chunkData = (AlignedTVList) tvList;
+    this.chunkDataSize = size;
+    this.deletionList = deletionList;
+
+    this.chunkPointReader =
+        (chunkData).getAlignedIterator(floatPrecision, encodingList, 
chunkDataSize, deletionList);
+    initAlignedChunkMeta((VectorMeasurementSchema) schema);
+  }
+
+  private void initAlignedChunkMeta(VectorMeasurementSchema schema)
+      throws IOException, QueryProcessException {
+    AlignedTVList alignedChunkData = (AlignedTVList) chunkData;
+    List<String> measurementList = schema.getSubMeasurementsList();
+    List<TSDataType> dataTypeList = schema.getSubMeasurementsTSDataTypeList();
+    // time chunk
+    Statistics timeStatistics = Statistics.getStatsByType(TSDataType.VECTOR);
+    IChunkMetadata timeChunkMetadata =
+        new ChunkMetadata(measurementUid, TSDataType.VECTOR, 0, 
timeStatistics);
+    List<IChunkMetadata> valueChunkMetadataList = new ArrayList<>();
+    // update time chunk
+    for (int row = 0; row < alignedChunkData.size(); row++) {
+      timeStatistics.update(alignedChunkData.getTime(row));
+    }
+    timeStatistics.setEmpty(false);
+    // update value chunk
+    for (int column = 0; column < measurementList.size(); column++) {
+      Statistics valueStatistics = 
Statistics.getStatsByType(dataTypeList.get(column));
+      IChunkMetadata valueChunkMetadata =
+          new ChunkMetadata(
+              measurementList.get(column), dataTypeList.get(column), 0, 
valueStatistics);
+      valueChunkMetadataList.add(valueChunkMetadata);
+      if (alignedChunkData.getValues().get(column) == null) {
+        valueStatistics.setEmpty(true);
+        continue;
+      } else {
+        valueStatistics.setEmpty(false);
+      }
+      for (int row = 0; row < alignedChunkData.size(); row++) {
+        long time = alignedChunkData.getTime(row);
+        int originRowIndex = alignedChunkData.getValueIndex(row);
+        boolean isNull = alignedChunkData.isValueMarked(originRowIndex, 
column);
+        if (isNull) {
+          continue;
+        }
+        switch (dataTypeList.get(column)) {
+          case BOOLEAN:
+            valueStatistics.update(
+                time, alignedChunkData.getBooleanByValueIndex(originRowIndex, 
column));
+            break;
+          case TEXT:
+            valueStatistics.update(
+                time, alignedChunkData.getBinaryByValueIndex(originRowIndex, 
column));
+            break;
+          case FLOAT:
+            valueStatistics.update(
+                time, alignedChunkData.getFloatByValueIndex(originRowIndex, 
column));
+            break;
+          case INT32:
+            valueStatistics.update(
+                time, alignedChunkData.getIntByValueIndex(originRowIndex, 
column));
+            break;
+          case INT64:
+            valueStatistics.update(
+                time, alignedChunkData.getLongByValueIndex(originRowIndex, 
column));
+            break;
+          case DOUBLE:
+            valueStatistics.update(
+                time, alignedChunkData.getDoubleByValueIndex(originRowIndex, 
column));
+            break;
+          default:
+            throw new QueryProcessException("Unsupported data type:" + 
dataType);
+        }
+      }
+    }
+    IChunkMetadata vectorChunkMetadata =
+        new AlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
+    vectorChunkMetadata.setChunkLoader(new MemChunkLoader(this));
+    vectorChunkMetadata.setVersion(Long.MAX_VALUE);
+    cachedMetaData = vectorChunkMetadata;
+  }
+
+  @Override
+  public IPointReader getPointReader() {
+    chunkPointReader =
+        chunkData.getAlignedIterator(floatPrecision, encodingList, 
chunkDataSize, deletionList);
+    return chunkPointReader;
+  }
+}
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 26492a3..b24313f 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
@@ -23,7 +23,6 @@ import org.apache.iotdb.db.query.reader.chunk.MemChunkLoader;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.encoding.encoder.Encoder;
-import org.apache.iotdb.tsfile.file.metadata.AlignedChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -32,14 +31,11 @@ import 
org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.reader.IPointReader;
-import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
-import org.apache.iotdb.tsfile.write.schema.VectorMeasurementSchema;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -60,14 +56,18 @@ public class ReadOnlyMemChunk {
 
   private int floatPrecision = 
TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
 
-  private IChunkMetadata cachedMetaData;
+  protected IChunkMetadata cachedMetaData;
 
   private TVList chunkData;
 
-  private IPointReader chunkPointReader;
+  protected IPointReader chunkPointReader;
 
   private int chunkDataSize;
 
+  public ReadOnlyMemChunk() {
+    this.deletionList = null;
+  }
+
   public ReadOnlyMemChunk(
       String measurementUid,
       TSDataType dataType,
@@ -144,106 +144,6 @@ public class ReadOnlyMemChunk {
     cachedMetaData = metaData;
   }
 
-  /**
-   * The constructor for Aligned type.
-   *
-   * @param schema VectorMeasurementSchema
-   * @param tvList VectorTvList
-   * @param size The Number of Chunk data points
-   * @param deletionList The timeRange of deletionList
-   */
-  public ReadOnlyMemChunk(
-      IMeasurementSchema schema, TVList tvList, int size, List<TimeRange> 
deletionList)
-      throws IOException, QueryProcessException {
-    this.measurementUid = schema.getMeasurementId();
-    this.dataType = schema.getType();
-
-    this.chunkData = tvList;
-    this.chunkDataSize = size;
-    this.deletionList = deletionList;
-
-    this.chunkPointReader =
-        tvList.getIterator(floatPrecision, encoding, chunkDataSize, 
deletionList);
-    initAlignedChunkMeta((VectorMeasurementSchema) schema);
-  }
-
-  @SuppressWarnings("squid:S3776") // high Cognitive Complexity
-  private void initAlignedChunkMeta(VectorMeasurementSchema schema)
-      throws IOException, QueryProcessException {
-    Statistics timeStatistics = Statistics.getStatsByType(TSDataType.VECTOR);
-    IChunkMetadata timeChunkMetadata =
-        new ChunkMetadata(measurementUid, TSDataType.VECTOR, 0, 
timeStatistics);
-    List<IChunkMetadata> valueChunkMetadataList = new ArrayList<>();
-    Statistics[] valueStatistics = new 
Statistics[schema.getSubMeasurementsTSDataTypeList().size()];
-    for (int i = 0; i < schema.getSubMeasurementsTSDataTypeList().size(); i++) 
{
-      valueStatistics[i] =
-          
Statistics.getStatsByType(schema.getSubMeasurementsTSDataTypeList().get(i));
-      IChunkMetadata valueChunkMetadata =
-          new ChunkMetadata(
-              schema.getSubMeasurementsList().get(i),
-              schema.getSubMeasurementsTSDataTypeList().get(i),
-              0,
-              valueStatistics[i]);
-      valueChunkMetadataList.add(valueChunkMetadata);
-    }
-    if (!isEmpty()) {
-      IPointReader iterator =
-          chunkData.getIterator(floatPrecision, encoding, chunkDataSize, 
deletionList);
-      while (iterator.hasNextTimeValuePair()) {
-        TimeValuePair timeValuePair = iterator.nextTimeValuePair();
-        timeStatistics.update(timeValuePair.getTimestamp());
-        updateValueStatistics(schema, valueStatistics, timeValuePair);
-      }
-    }
-    timeStatistics.setEmpty(isEmpty());
-    for (Statistics valueStatistic : valueStatistics) {
-      valueStatistic.setEmpty(isEmpty());
-    }
-    IChunkMetadata vectorChunkMetadata =
-        new AlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
-    vectorChunkMetadata.setChunkLoader(new MemChunkLoader(this));
-    vectorChunkMetadata.setVersion(Long.MAX_VALUE);
-    cachedMetaData = vectorChunkMetadata;
-  }
-
-  private void updateValueStatistics(
-      IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair 
timeValuePair)
-      throws QueryProcessException {
-    for (int i = 0; i < schema.getSubMeasurementsTSDataTypeList().size(); i++) 
{
-      if (timeValuePair.getValue().getVector() == null || 
timeValuePair.getValue().getVector()[i] == null) {
-        continue;
-      }
-      switch (schema.getSubMeasurementsTSDataTypeList().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/engine/storagegroup/TsFileProcessor.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index 80fb3c3..ef9fb4a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -406,7 +406,8 @@ public class TsFileProcessor {
         continue;
       }
       // extending the column of aligned mem chunk
-      if (vectorMemChunk != null && 
!vectorMemChunk.containsMeasurement(insertRowPlan.getMeasurements()[i])) {
+      if (vectorMemChunk != null
+          && 
!vectorMemChunk.containsMeasurement(insertRowPlan.getMeasurements()[i])) {
         memTableIncrement +=
             (vectorMemChunk.alignedListSize() / 
PrimitiveArrayManager.ARRAY_SIZE + 1)
                 * insertRowPlan.getDataTypes()[i].getDataTypeSize();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/path/AlignedPath.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/path/AlignedPath.java
index 5a0a68e..bf34e4c 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/path/AlignedPath.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/path/AlignedPath.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.metadata.path;
 
 import org.apache.iotdb.db.engine.memtable.AlignedWritableMemChunk;
 import org.apache.iotdb.db.engine.memtable.IWritableMemChunk;
+import org.apache.iotdb.db.engine.querycontext.AlignedReadOnlyMemChunk;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.engine.querycontext.ReadOnlyMemChunk;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
@@ -347,8 +348,9 @@ public class AlignedPath extends PartialPath {
       return null;
     }
     // get sorted tv list is synchronized so different query can get right 
sorted list reference
-    TVList vectorTvListCopy = 
alignedMemChunk.getSortedTvListForQuery(schemaList);
-    int curSize = vectorTvListCopy.size();
-    return new ReadOnlyMemChunk(getMeasurementSchema(), vectorTvListCopy, 
curSize, deletionList);
+    TVList alignedTvListCopy = 
alignedMemChunk.getSortedTvListForQuery(schemaList);
+    int curSize = alignedTvListCopy.size();
+    return new AlignedReadOnlyMemChunk(
+        getMeasurementSchema(), alignedTvListCopy, curSize, deletionList);
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
 
b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
index f2a5d76..c82ab5b 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
@@ -127,22 +127,30 @@ public class AlignedTVList extends TVList {
 
   @Override
   public Object getAlignedValue(int index) {
-    return getAlignedValue(index, null, null);
+    return getAlignedValueForQuery(index, null, null);
   }
 
   @Override
-  public Object getAlignedValue(int index, Integer floatPrecision, TSEncoding 
encoding) {
+  protected TimeValuePair getTimeValuePair(
+      int index, long time, Integer floatPrecision, TSEncoding encoding) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  private Object getAlignedValueForQuery(
+      int index, Integer floatPrecision, List<TSEncoding> encodingList) {
     if (index >= size) {
       throw new ArrayIndexOutOfBoundsException(index);
     }
     int arrayIndex = index / ARRAY_SIZE;
     int elementIndex = index % ARRAY_SIZE;
     int valueIndex = indices.get(arrayIndex)[elementIndex];
-    return getAlignedValueByValueIndex(valueIndex, null, floatPrecision, 
encoding);
+    return getAlignedValueByValueIndex(valueIndex, null, floatPrecision, 
encodingList);
   }
 
   public TsPrimitiveType getAlignedValue(
-      List<Integer> timeDuplicatedIndexList, Integer floatPrecision, 
TSEncoding encoding) {
+      List<Integer> timeDuplicatedIndexList,
+      Integer floatPrecision,
+      List<TSEncoding> encodingList) {
     int[] validIndexesForTimeDuplicatedRows = new int[values.size()];
     for (int i = 0; i < values.size(); i++) {
       validIndexesForTimeDuplicatedRows[i] =
@@ -152,14 +160,14 @@ public class AlignedTVList extends TVList {
         timeDuplicatedIndexList.get(timeDuplicatedIndexList.size() - 1),
         validIndexesForTimeDuplicatedRows,
         floatPrecision,
-        encoding);
+        encodingList);
   }
 
   private TsPrimitiveType getAlignedValueByValueIndex(
       int valueIndex,
       int[] validIndexesForTimeDuplicatedRows,
       Integer floatPrecision,
-      TSEncoding encoding) {
+      List<TSEncoding> encodingList) {
     if (valueIndex >= size) {
       throw new ArrayIndexOutOfBoundsException(valueIndex);
     }
@@ -170,8 +178,8 @@ public class AlignedTVList extends TVList {
       List<Object> columnValues = values.get(columnIndex);
       if (columnValues == null
           || bitMaps != null
-          && bitMaps.get(columnIndex) != null
-          && isValueMarked(valueIndex, columnIndex)) {
+              && bitMaps.get(columnIndex) != null
+              && isValueMarked(valueIndex, columnIndex)) {
         continue;
       }
       if (validIndexesForTimeDuplicatedRows != null) {
@@ -186,9 +194,10 @@ public class AlignedTVList extends TVList {
         case FLOAT:
           float valueF = ((float[]) 
columnValues.get(arrayIndex))[elementIndex];
           if (floatPrecision != null
-              && encoding != null
+              && encodingList != null
               && !Float.isNaN(valueF)
-              && (encoding == TSEncoding.RLE || encoding == 
TSEncoding.TS_2DIFF)) {
+              && (encodingList.get(columnIndex) == TSEncoding.RLE
+                  || encodingList.get(columnIndex) == TSEncoding.TS_2DIFF)) {
             valueF = MathUtils.roundWithGivenPrecision(valueF, floatPrecision);
           }
           vector[columnIndex] = TsPrimitiveType.getByType(TSDataType.FLOAT, 
valueF);
@@ -204,9 +213,10 @@ public class AlignedTVList extends TVList {
         case DOUBLE:
           double valueD = ((double[]) 
columnValues.get(arrayIndex))[elementIndex];
           if (floatPrecision != null
-              && encoding != null
+              && encodingList != null
               && !Double.isNaN(valueD)
-              && (encoding == TSEncoding.RLE || encoding == 
TSEncoding.TS_2DIFF)) {
+              && (encodingList.get(columnIndex) == TSEncoding.RLE
+                  || encodingList.get(columnIndex) == TSEncoding.TS_2DIFF)) {
             valueD = MathUtils.roundWithGivenPrecision(valueD, floatPrecision);
           }
           vector[columnIndex] = TsPrimitiveType.getByType(TSDataType.DOUBLE, 
valueD);
@@ -672,20 +682,19 @@ public class AlignedTVList extends TVList {
 
   @Override
   public TimeValuePair getTimeValuePair(int index) {
-    return new TimeValuePair(getTime(index), (TsPrimitiveType) 
getAlignedValue(index, null, null));
+    return new TimeValuePair(
+        getTime(index), (TsPrimitiveType) getAlignedValueForQuery(index, null, 
null));
   }
 
-  @Override
   protected TimeValuePair getTimeValuePair(
-      int index, long time, Integer floatPrecision, TSEncoding encoding) {
+      int index, long time, Integer floatPrecision, List<TSEncoding> 
encodingList) {
     return new TimeValuePair(
-        time, (TsPrimitiveType) getAlignedValue(index, floatPrecision, 
encoding));
+        time, (TsPrimitiveType) getAlignedValueForQuery(index, floatPrecision, 
encodingList));
   }
 
-  @Override
   public TimeValuePair getTimeValuePairForTimeDuplicatedRows(
-      List<Integer> indexList, long time, Integer floatPrecision, TSEncoding 
encoding) {
-    return new TimeValuePair(time, getAlignedValue(indexList, floatPrecision, 
encoding));
+      List<Integer> indexList, long time, Integer floatPrecision, 
List<TSEncoding> encodingList) {
+    return new TimeValuePair(time, getAlignedValue(indexList, floatPrecision, 
encodingList));
   }
 
   @Override
@@ -865,18 +874,26 @@ public class AlignedTVList extends TVList {
   @Override
   public IPointReader getIterator(
       int floatPrecision, TSEncoding encoding, int size, List<TimeRange> 
deletionList) {
-    return new AlignedIte(floatPrecision, encoding, size, deletionList);
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  public IPointReader getAlignedIterator(
+      int floatPrecision, List<TSEncoding> encodingList, int size, 
List<TimeRange> deletionList) {
+    return new AlignedIte(floatPrecision, encodingList, size, deletionList);
   }
 
   private class AlignedIte extends Ite {
 
+    private List<TSEncoding> encodingList;
+
     public AlignedIte() {
       super();
     }
 
     public AlignedIte(
-        int floatPrecision, TSEncoding encoding, int size, List<TimeRange> 
deletionList) {
-      super(floatPrecision, encoding, size, deletionList);
+        int floatPrecision, List<TSEncoding> encodingList, int size, 
List<TimeRange> deletionList) {
+      super(floatPrecision, null, size, deletionList);
+      this.encodingList = encodingList;
     }
 
     @Override
@@ -901,10 +918,10 @@ public class AlignedTVList extends TVList {
         if (timeDuplicatedAlignedRowIndexList != null) {
           tvPair =
               getTimeValuePairForTimeDuplicatedRows(
-                  timeDuplicatedAlignedRowIndexList, time, floatPrecision, 
encoding);
+                  timeDuplicatedAlignedRowIndexList, time, floatPrecision, 
encodingList);
           timeDuplicatedAlignedRowIndexList = null;
         } else {
-          tvPair = getTimeValuePair(cur, time, floatPrecision, encoding);
+          tvPair = getTimeValuePair(cur, time, floatPrecision, encodingList);
         }
         cur++;
         if (tvPair.getValue() != null) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java 
b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java
index 8f1536b..2d895c4 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java
@@ -530,7 +530,7 @@ public abstract class TVList {
     protected boolean hasCachedPair;
     protected int cur;
     protected Integer floatPrecision;
-    protected TSEncoding encoding;
+    private TSEncoding encoding;
     private int deleteCursor = 0;
     /**
      * because TV list may be share with different query, each iterator has to 
record it's own size

Reply via email to