in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tablet/parser/TabletInsertionEventParser.java [428:585]
private static Object filterValueColumnsByRowIndexList(
@NonNull final TSDataType type,
@NonNull final Object originValueColumn,
@NonNull final List<Integer> rowIndexList,
final boolean isSingleOriginValueColumn,
@NonNull final BitMap originNullValueColumnBitmap,
@NonNull final BitMap nullValueColumnBitmap /* output parameters */) {
switch (type) {
case INT32:
{
final int[] intValueColumns =
isSingleOriginValueColumn
? new int[] {(int) originValueColumn}
: (int[]) originValueColumn;
final int[] valueColumns = new int[rowIndexList.size()];
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = 0;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = intValueColumns[rowIndexList.get(i)];
}
}
return valueColumns;
}
case DATE:
{
// Always store 'LocalDate[]' to help convert to tablet
final LocalDate[] valueColumns = new LocalDate[rowIndexList.size()];
if (isSingleOriginValueColumn && originValueColumn instanceof LocalDate
|| !isSingleOriginValueColumn && originValueColumn instanceof LocalDate[]) {
// For tablet
final LocalDate[] dateValueColumns =
isSingleOriginValueColumn
? new LocalDate[] {(LocalDate) originValueColumn}
: (LocalDate[]) originValueColumn;
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = EMPTY_LOCALDATE;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = dateValueColumns[rowIndexList.get(i)];
}
}
} else {
// For insertRowNode / insertTabletNode
final int[] intValueColumns =
isSingleOriginValueColumn
? new int[] {(int) originValueColumn}
: (int[]) originValueColumn;
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = EMPTY_LOCALDATE;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] =
DateUtils.parseIntToLocalDate(intValueColumns[rowIndexList.get(i)]);
}
}
}
return valueColumns;
}
case INT64:
case TIMESTAMP:
{
final long[] longValueColumns =
isSingleOriginValueColumn
? new long[] {(long) originValueColumn}
: (long[]) originValueColumn;
final long[] valueColumns = new long[rowIndexList.size()];
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = 0L;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = longValueColumns[rowIndexList.get(i)];
}
}
return valueColumns;
}
case FLOAT:
{
final float[] floatValueColumns =
isSingleOriginValueColumn
? new float[] {(float) originValueColumn}
: (float[]) originValueColumn;
final float[] valueColumns = new float[rowIndexList.size()];
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = 0F;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = floatValueColumns[rowIndexList.get(i)];
}
}
return valueColumns;
}
case DOUBLE:
{
final double[] doubleValueColumns =
isSingleOriginValueColumn
? new double[] {(double) originValueColumn}
: (double[]) originValueColumn;
final double[] valueColumns = new double[rowIndexList.size()];
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = 0D;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = doubleValueColumns[rowIndexList.get(i)];
}
}
return valueColumns;
}
case BOOLEAN:
{
final boolean[] booleanValueColumns =
isSingleOriginValueColumn
? new boolean[] {(boolean) originValueColumn}
: (boolean[]) originValueColumn;
final boolean[] valueColumns = new boolean[rowIndexList.size()];
for (int i = 0; i < rowIndexList.size(); ++i) {
if (originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = false;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = booleanValueColumns[rowIndexList.get(i)];
}
}
return valueColumns;
}
case TEXT:
case BLOB:
case STRING:
{
final Binary[] binaryValueColumns =
isSingleOriginValueColumn
? new Binary[] {(Binary) originValueColumn}
: (Binary[]) originValueColumn;
final Binary[] valueColumns = new Binary[rowIndexList.size()];
for (int i = 0; i < rowIndexList.size(); ++i) {
if (Objects.isNull(binaryValueColumns[rowIndexList.get(i)])
|| Objects.isNull(binaryValueColumns[rowIndexList.get(i)].getValues())
|| originNullValueColumnBitmap.isMarked(rowIndexList.get(i))) {
valueColumns[i] = Binary.EMPTY_VALUE;
nullValueColumnBitmap.mark(i);
} else {
valueColumns[i] = new Binary(binaryValueColumns[rowIndexList.get(i)].getValues());
}
}
return valueColumns;
}
default:
throw new UnSupportedDataTypeException(
String.format("Data type %s is not supported.", type));
}
}