From b8207e278f2128c518f760901ea38b81920246bc Mon Sep 17 00:00:00 2001 From: Nero Date: Thu, 25 Dec 2025 16:09:22 +0800 Subject: [PATCH] Allow other value of data type can be converted to value of Binary data type when find type is not consistence in the column of tsblock. --- .../apache/tsfile/utils/TsPrimitiveType.java | 26 +++++++++++++++++++ .../common/block/column/BooleanColumn.java | 16 ++++++++++++ .../common/block/column/DoubleColumn.java | 16 ++++++++++++ .../read/common/block/column/FloatColumn.java | 16 ++++++++++++ .../read/common/block/column/IntColumn.java | 16 ++++++++++++ .../read/common/block/column/LongColumn.java | 16 ++++++++++++ .../apache/tsfile/read/common/ColumnTest.java | 18 +++++++++++++ 7 files changed, 124 insertions(+) diff --git a/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java b/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java index 4850d1ade..0538f1b39 100644 --- a/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java +++ b/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java @@ -22,6 +22,7 @@ import org.apache.tsfile.write.UnSupportedDataTypeException; import java.io.Serializable; +import java.nio.charset.StandardCharsets; import java.util.Arrays; public abstract class TsPrimitiveType implements Serializable { @@ -198,6 +199,11 @@ public void setBoolean(boolean val) { this.value = val; } + @Override + public Binary getBinary() { + return new Binary(String.valueOf(this.value), StandardCharsets.UTF_8); + } + @Override public void setObject(Object val) { if (val instanceof Boolean) { @@ -280,6 +286,11 @@ public float getFloat() { return (float) value; } + @Override + public Binary getBinary() { + return new Binary(String.valueOf(this.value), StandardCharsets.UTF_8); + } + @Override public void setInt(int val) { this.value = val; @@ -357,6 +368,11 @@ public double getDouble() { return (double) value; } + @Override + public Binary getBinary() { + return new Binary(String.valueOf(this.value), StandardCharsets.UTF_8); + } + @Override public void setLong(long val) { this.value = val; @@ -434,6 +450,11 @@ public double getDouble() { return (double) value; } + @Override + public Binary getBinary() { + return new Binary(String.valueOf(this.value), StandardCharsets.UTF_8); + } + @Override public void setFloat(float val) { this.value = val; @@ -506,6 +527,11 @@ public double getDouble() { return value; } + @Override + public Binary getBinary() { + return new Binary(String.valueOf(this.value), StandardCharsets.UTF_8); + } + @Override public void setDouble(double val) { this.value = val; diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/BooleanColumn.java b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/BooleanColumn.java index 7b9aca747..b00a5a66c 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/BooleanColumn.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/BooleanColumn.java @@ -22,9 +22,11 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.block.column.ColumnEncoding; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.RamUsageEstimator; import org.apache.tsfile.utils.TsPrimitiveType; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; @@ -93,11 +95,25 @@ public boolean getBoolean(int position) { return values[position + arrayOffset]; } + @Override + public Binary getBinary(int position) { + return new Binary(String.valueOf(values[position + arrayOffset]), StandardCharsets.UTF_8); + } + @Override public boolean[] getBooleans() { return values; } + @Override + public Binary[] getBinaries() { + Binary[] binaries = new Binary[values.length]; + for (int i = 0; i < values.length; i++) { + binaries[i] = new Binary(String.valueOf(values[i]), StandardCharsets.UTF_8); + } + return binaries; + } + @Override public Object getObject(int position) { return getBoolean(position); diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/DoubleColumn.java b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/DoubleColumn.java index e0aff8f7a..7c99610c0 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/DoubleColumn.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/DoubleColumn.java @@ -22,9 +22,11 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.block.column.ColumnEncoding; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.RamUsageEstimator; import org.apache.tsfile.utils.TsPrimitiveType; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; @@ -94,11 +96,25 @@ public double getDouble(int position) { return values[position + arrayOffset]; } + @Override + public Binary getBinary(int position) { + return new Binary(String.valueOf(values[position + arrayOffset]), StandardCharsets.UTF_8); + } + @Override public double[] getDoubles() { return values; } + @Override + public Binary[] getBinaries() { + Binary[] binaries = new Binary[values.length]; + for (int i = 0; i < values.length; i++) { + binaries[i] = new Binary(String.valueOf(values[i]), StandardCharsets.UTF_8); + } + return binaries; + } + @Override public Object getObject(int position) { return getDouble(position); diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/FloatColumn.java b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/FloatColumn.java index 8a576c0ce..85cd7916f 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/FloatColumn.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/FloatColumn.java @@ -22,9 +22,11 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.block.column.ColumnEncoding; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.RamUsageEstimator; import org.apache.tsfile.utils.TsPrimitiveType; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; @@ -100,6 +102,11 @@ public double getDouble(int position) { return values[position + arrayOffset]; } + @Override + public Binary getBinary(int position) { + return new Binary(String.valueOf(values[position + arrayOffset]), StandardCharsets.UTF_8); + } + @Override public float[] getFloats() { return values; @@ -114,6 +121,15 @@ public double[] getDoubles() { return doubles; } + @Override + public Binary[] getBinaries() { + Binary[] binaries = new Binary[values.length]; + for (int i = 0; i < values.length; i++) { + binaries[i] = new Binary(String.valueOf(values[i]), StandardCharsets.UTF_8); + } + return binaries; + } + @Override public Object getObject(int position) { return getFloat(position); diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java index 6820a83eb..a5ea68519 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java @@ -22,9 +22,11 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.block.column.ColumnEncoding; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.RamUsageEstimator; import org.apache.tsfile.utils.TsPrimitiveType; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; @@ -110,6 +112,11 @@ public double getDouble(int position) { return values[position + arrayOffset]; } + @Override + public Binary getBinary(int position) { + return new Binary(String.valueOf(values[position + arrayOffset]), StandardCharsets.UTF_8); + } + @Override public int[] getInts() { return values; @@ -142,6 +149,15 @@ public double[] getDoubles() { return result; } + @Override + public Binary[] getBinaries() { + Binary[] binaries = new Binary[values.length]; + for (int i = 0; i < values.length; i++) { + binaries[i] = new Binary(String.valueOf(values[i]), StandardCharsets.UTF_8); + } + return binaries; + } + @Override public Object getObject(int position) { return getInt(position); diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/LongColumn.java b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/LongColumn.java index 03d8af0e6..b2dd5d1a4 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/LongColumn.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/LongColumn.java @@ -22,9 +22,11 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.block.column.ColumnEncoding; import org.apache.tsfile.enums.TSDataType; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.RamUsageEstimator; import org.apache.tsfile.utils.TsPrimitiveType; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; @@ -100,6 +102,11 @@ public double getDouble(int position) { return values[position + arrayOffset]; } + @Override + public Binary getBinary(int position) { + return new Binary(String.valueOf(values[position + arrayOffset]), StandardCharsets.UTF_8); + } + @Override public long[] getLongs() { return values; @@ -114,6 +121,15 @@ public double[] getDoubles() { return doubles; } + @Override + public Binary[] getBinaries() { + Binary[] binaries = new Binary[values.length]; + for (int i = 0; i < values.length; i++) { + binaries[i] = new Binary(String.valueOf(values[i]), StandardCharsets.UTF_8); + } + return binaries; + } + @Override public Object getObject(int position) { return getLong(position); diff --git a/java/tsfile/src/test/java/org/apache/tsfile/read/common/ColumnTest.java b/java/tsfile/src/test/java/org/apache/tsfile/read/common/ColumnTest.java index 0cb3f2e78..f3a784324 100644 --- a/java/tsfile/src/test/java/org/apache/tsfile/read/common/ColumnTest.java +++ b/java/tsfile/src/test/java/org/apache/tsfile/read/common/ColumnTest.java @@ -38,11 +38,13 @@ import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn; import org.apache.tsfile.read.common.block.column.TimeColumn; import org.apache.tsfile.read.common.block.column.TimeColumnBuilder; +import org.apache.tsfile.utils.Binary; import org.apache.tsfile.utils.BytesUtils; import org.junit.Assert; import org.junit.Test; +import java.nio.charset.StandardCharsets; import java.util.Optional; public class ColumnTest { @@ -224,7 +226,11 @@ public void booleanColumnFilterPositionsTest() { Assert.assertTrue(columnByGetPositions instanceof DictionaryColumn); Assert.assertEquals(2, columnByGetPositions.getPositionCount()); Assert.assertFalse(columnByGetPositions.getBoolean(0)); + Assert.assertEquals( + new Binary("false", StandardCharsets.UTF_8), columnByGetPositions.getBinary(0)); Assert.assertTrue(columnByGetPositions.getBoolean(1)); + Assert.assertEquals( + new Binary("true", StandardCharsets.UTF_8), columnByGetPositions.getBinary(1)); Column columnByCopyPositions = originalColumn.copyPositions(selectedPositions, 1, 2); Assert.assertEquals(2, columnByCopyPositions.getPositionCount()); @@ -242,7 +248,9 @@ public void doubleColumnSubColumnTest() { doubleColumn1 = (DoubleColumn) doubleColumn1.subColumn(5); Assert.assertEquals(5, doubleColumn1.getPositionCount()); Assert.assertEquals(5.0, doubleColumn1.getDouble(0), 0.001); + Assert.assertEquals(new Binary("5.0", StandardCharsets.UTF_8), doubleColumn1.getBinary(0)); Assert.assertEquals(9.0, doubleColumn1.getDouble(4), 0.001); + Assert.assertEquals(new Binary("9.0", StandardCharsets.UTF_8), doubleColumn1.getBinary(4)); DoubleColumn doubleColumn2 = (DoubleColumn) doubleColumn1.subColumn(3); Assert.assertEquals(2, doubleColumn2.getPositionCount()); @@ -303,7 +311,9 @@ public void floatColumnSubColumnTest() { floatColumn1 = (FloatColumn) floatColumn1.subColumn(5); Assert.assertEquals(5, floatColumn1.getPositionCount()); Assert.assertEquals(5.0, floatColumn1.getFloat(0), 0.001); + Assert.assertEquals(new Binary("5.0", StandardCharsets.UTF_8), floatColumn1.getBinary(0)); Assert.assertEquals(9.0, floatColumn1.getFloat(4), 0.001); + Assert.assertEquals(new Binary("9.0", StandardCharsets.UTF_8), floatColumn1.getBinary(4)); FloatColumn floatColumn2 = (FloatColumn) floatColumn1.subColumn(3); Assert.assertEquals(2, floatColumn2.getPositionCount()); @@ -414,6 +424,10 @@ public void intColumnFilterPositionsTest() { Assert.assertEquals(2, columnByCopyPositions.getPositionCount()); Assert.assertEquals(3, columnByCopyPositions.getInt(0)); Assert.assertEquals(5, columnByCopyPositions.getInt(1)); + Assert.assertEquals( + new Binary("3", StandardCharsets.UTF_8), columnByCopyPositions.getBinary(0)); + Assert.assertEquals( + new Binary("5", StandardCharsets.UTF_8), columnByCopyPositions.getBinary(1)); } @Test @@ -427,11 +441,15 @@ public void longColumnSubColumnTest() { Assert.assertEquals(5, longColumn1.getPositionCount()); Assert.assertEquals(5, longColumn1.getLong(0)); Assert.assertEquals(9, longColumn1.getLong(4)); + Assert.assertEquals(new Binary("5", StandardCharsets.UTF_8), longColumn1.getBinary(0)); + Assert.assertEquals(new Binary("9", StandardCharsets.UTF_8), longColumn1.getBinary(4)); LongColumn longColumn2 = (LongColumn) longColumn1.subColumn(3); Assert.assertEquals(2, longColumn2.getPositionCount()); Assert.assertEquals(8, longColumn2.getLong(0)); Assert.assertEquals(9, longColumn2.getLong(1)); + Assert.assertEquals(new Binary("8", StandardCharsets.UTF_8), longColumn2.getBinary(0)); + Assert.assertEquals(new Binary("9", StandardCharsets.UTF_8), longColumn2.getBinary(1)); Assert.assertSame(longColumn1.getLongs(), longColumn2.getLongs()); }