You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2021/11/04 06:01:05 UTC

[iotdb] branch new_vector updated: fix insert s1 s2 then s2 s1 bug

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


The following commit(s) were added to refs/heads/new_vector by this push:
     new 8ed8d17  fix insert s1 s2 then s2 s1 bug
8ed8d17 is described below

commit 8ed8d17f33dd7802a2a4d421f7fa2021cdf89fb6
Author: HTHou <hh...@outlook.com>
AuthorDate: Thu Nov 4 14:00:28 2021 +0800

    fix insert s1 s2 then s2 s1 bug
---
 .../engine/memtable/AlignedWritableMemChunk.java   | 24 +++++-----
 .../db/engine/memtable/IWritableMemChunk.java      |  4 +-
 .../db/utils/datastructure/AlignedTVList.java      | 54 +++++++++++++---------
 .../iotdb/db/utils/datastructure/TVList.java       |  4 +-
 4 files changed, 49 insertions(+), 37 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 5daded1..a04651e 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
@@ -108,8 +108,8 @@ public class AlignedWritableMemChunk implements IWritableMemChunk {
 
   @Override
   public void putAlignedValues(
-      long[] t, Object[] v, BitMap[] bitMaps, int[] columnOrder, int start, int end) {
-    list.putAlignedValues(t, v, bitMaps, columnOrder, start, end);
+      long[] t, Object[] v, BitMap[] bitMaps, int[] columnIndex, int start, int end) {
+    list.putAlignedValues(t, v, bitMaps, columnIndex, start, end);
   }
 
   @Override
@@ -119,8 +119,8 @@ public class AlignedWritableMemChunk implements IWritableMemChunk {
 
   @Override
   public void writeAlignedValue(long insertTime, Object[] objectValue, IMeasurementSchema schema) {
-    int[] columnOrder = checkColumnOrder(schema);
-    putAlignedValue(insertTime, objectValue, columnOrder);
+    int[] columnIndexArray = checkColumnOrder(schema);
+    putAlignedValue(insertTime, objectValue, columnIndexArray);
   }
 
   @Override
@@ -137,18 +137,20 @@ public class AlignedWritableMemChunk implements IWritableMemChunk {
       IMeasurementSchema schema,
       int start,
       int end) {
-    int[] columnOrder = checkColumnOrder(schema);
-    putAlignedValues(times, valueList, bitMaps, columnOrder, start, end);
+    int[] columnIndexArray = checkColumnOrder(schema);
+    putAlignedValues(times, valueList, bitMaps, columnIndexArray, start, end);
   }
 
   private int[] checkColumnOrder(IMeasurementSchema schema) {
     VectorMeasurementSchema vectorSchema = (VectorMeasurementSchema) schema;
-    List<String> measurementIdList = vectorSchema.getSubMeasurementsList();
-    int[] columnOrder = new int[measurementIdList.size()];
-    for (int i = 0; i < measurementIdList.size(); i++) {
-      columnOrder[i] = alignedMeasurementIndexMap.get(measurementIdList.get(i));
+    List<String> measurementIdsInInsertPlan = vectorSchema.getSubMeasurementsList();
+    List<String> measurementIdsInTVList =
+        ((VectorMeasurementSchema) this.schema).getSubMeasurementsList();
+    int[] columnIndexArray = new int[measurementIdsInTVList.size()];
+    for (int i = 0; i < columnIndexArray.length; i++) {
+      columnIndexArray[i] = measurementIdsInInsertPlan.indexOf(measurementIdsInTVList.get(i));
     }
-    return columnOrder;
+    return columnIndexArray;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/IWritableMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/IWritableMemChunk.java
index b8001c2..203f4e6 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/IWritableMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/IWritableMemChunk.java
@@ -41,7 +41,7 @@ public interface IWritableMemChunk {
 
   void putBoolean(long t, boolean v);
 
-  void putAlignedValue(long t, Object[] v, int[] columnOrder);
+  void putAlignedValue(long t, Object[] v, int[] columnIndexArray);
 
   void putLongs(long[] t, long[] v, BitMap bitMap, int start, int end);
 
@@ -56,7 +56,7 @@ public interface IWritableMemChunk {
   void putBooleans(long[] t, boolean[] v, BitMap bitMap, int start, int end);
 
   void putAlignedValues(
-      long[] t, Object[] v, BitMap[] bitMaps, int[] columnOrder, int start, int end);
+      long[] t, Object[] v, BitMap[] bitMaps, int[] columnIndexArray, int start, int end);
 
   void write(long insertTime, Object objectValue);
 
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 5576f08..fa2af0d 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
@@ -76,14 +76,14 @@ public class AlignedTVList extends TVList {
 
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   @Override
-  public void putAlignedValue(long timestamp, Object[] value, int[] columnOrder) {
+  public void putAlignedValue(long timestamp, Object[] value, int[] columnIndexArray) {
     checkExpansion();
     int arrayIndex = size / ARRAY_SIZE;
     int elementIndex = size % ARRAY_SIZE;
     minTime = Math.min(minTime, timestamp);
     timestamps.get(arrayIndex)[elementIndex] = timestamp;
     for (int i = 0; i < values.size(); i++) {
-      Object columnValue = value[columnOrder[i]];
+      Object columnValue = columnIndexArray[i] < 0 ? null : value[columnIndexArray[i]];
       List<Object> columnValues = values.get(i);
       if (columnValue == null) {
         markNullValue(i, arrayIndex, elementIndex);
@@ -679,7 +679,7 @@ public class AlignedTVList extends TVList {
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   @Override
   public void putAlignedValues(
-      long[] time, Object[] value, BitMap[] bitMaps, int[] columnOrder, int start, int end) {
+      long[] time, Object[] value, BitMap[] bitMaps, int[] columnIndexArray, int start, int end) {
     checkExpansion();
     int idx = start;
 
@@ -693,14 +693,15 @@ public class AlignedTVList extends TVList {
       if (internalRemaining >= inputRemaining) {
         // the remaining inputs can fit the last array, copy all remaining inputs into last array
         System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-        arrayCopy(value, idx, arrayIdx, elementIdx, inputRemaining, columnOrder);
+        arrayCopy(value, idx, arrayIdx, elementIdx, inputRemaining, columnIndexArray);
         for (int i = 0; i < inputRemaining; i++) {
           indices.get(arrayIdx)[elementIdx + i] = size;
-          if (bitMaps != null) {
-            for (int j = 0; j < bitMaps.length; j++) {
-              if (bitMaps[columnOrder[j]] != null && bitMaps[columnOrder[j]].isMarked(idx + i)) {
-                markNullValue(j, arrayIdx, elementIdx + i);
-              }
+          for (int j = 0; j < values.size(); j++) {
+            if (columnIndexArray[j] < 0
+                || bitMaps != null
+                    && bitMaps[columnIndexArray[j]] != null
+                    && bitMaps[columnIndexArray[j]].isMarked(idx + i)) {
+              markNullValue(j, arrayIdx, elementIdx + i);
             }
           }
           size++;
@@ -710,14 +711,15 @@ public class AlignedTVList extends TVList {
         // the remaining inputs cannot fit the last array, fill the last array and create a new
         // one and enter the next loop
         System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-        arrayCopy(value, idx, arrayIdx, elementIdx, internalRemaining, columnOrder);
+        arrayCopy(value, idx, arrayIdx, elementIdx, internalRemaining, columnIndexArray);
         for (int i = 0; i < internalRemaining; i++) {
           indices.get(arrayIdx)[elementIdx + i] = size;
-          if (bitMaps != null) {
-            for (int j = 0; j < bitMaps.length; j++) {
-              if (bitMaps[columnOrder[j]] != null && bitMaps[columnOrder[j]].isMarked(idx + i)) {
-                markNullValue(j, arrayIdx, elementIdx + i);
-              }
+          for (int j = 0; j < values.size(); j++) {
+            if (columnIndexArray[j] < 0
+                || bitMaps != null
+                    && bitMaps[columnIndexArray[j]] != null
+                    && bitMaps[columnIndexArray[j]].isMarked(idx + i)) {
+              markNullValue(j, arrayIdx, elementIdx + i);
             }
           }
           size++;
@@ -729,33 +731,41 @@ public class AlignedTVList extends TVList {
   }
 
   private void arrayCopy(
-      Object[] value, int idx, int arrayIndex, int elementIndex, int remaining, int[] columnOrder) {
+      Object[] value,
+      int idx,
+      int arrayIndex,
+      int elementIndex,
+      int remaining,
+      int[] columnIndexArray) {
     for (int i = 0; i < values.size(); i++) {
+      if (columnIndexArray[i] < 0) {
+        continue;
+      }
       List<Object> columnValues = values.get(i);
       switch (dataTypes.get(i)) {
         case TEXT:
           Binary[] arrayT = ((Binary[]) columnValues.get(arrayIndex));
-          System.arraycopy(value[columnOrder[i]], idx, arrayT, elementIndex, remaining);
+          System.arraycopy(value[columnIndexArray[i]], idx, arrayT, elementIndex, remaining);
           break;
         case FLOAT:
           float[] arrayF = ((float[]) columnValues.get(arrayIndex));
-          System.arraycopy(value[columnOrder[i]], idx, arrayF, elementIndex, remaining);
+          System.arraycopy(value[columnIndexArray[i]], idx, arrayF, elementIndex, remaining);
           break;
         case INT32:
           int[] arrayI = ((int[]) columnValues.get(arrayIndex));
-          System.arraycopy(value[columnOrder[i]], idx, arrayI, elementIndex, remaining);
+          System.arraycopy(value[columnIndexArray[i]], idx, arrayI, elementIndex, remaining);
           break;
         case INT64:
           long[] arrayL = ((long[]) columnValues.get(arrayIndex));
-          System.arraycopy(value[columnOrder[i]], idx, arrayL, elementIndex, remaining);
+          System.arraycopy(value[columnIndexArray[i]], idx, arrayL, elementIndex, remaining);
           break;
         case DOUBLE:
           double[] arrayD = ((double[]) columnValues.get(arrayIndex));
-          System.arraycopy(value[columnOrder[i]], idx, arrayD, elementIndex, remaining);
+          System.arraycopy(value[columnIndexArray[i]], idx, arrayD, elementIndex, remaining);
           break;
         case BOOLEAN:
           boolean[] arrayB = ((boolean[]) columnValues.get(arrayIndex));
-          System.arraycopy(value[columnOrder[i]], idx, arrayB, elementIndex, remaining);
+          System.arraycopy(value[columnIndexArray[i]], idx, arrayB, elementIndex, remaining);
           break;
         default:
           break;
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 a77544a..8fdecb0 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
@@ -142,7 +142,7 @@ public abstract class TVList {
     throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
   }
 
-  public void putAlignedValue(long time, Object[] value, int[] columnOrder) {
+  public void putAlignedValue(long time, Object[] value, int[] columnIndexArray) {
     throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
   }
 
@@ -171,7 +171,7 @@ public abstract class TVList {
   }
 
   public void putAlignedValues(
-      long[] time, Object[] value, BitMap[] bitMaps, int[] columnOrder, int start, int end) {
+      long[] time, Object[] value, BitMap[] bitMaps, int[] columnIndexArray, int start, int end) {
     throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
   }