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);
}