You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2025/07/14 09:06:09 UTC
(iotdb) 07/08: Fix display of Blob type in last query
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch object_type
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit be06663ff4af6409a53c247ac7ce7ee12f69e249
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Mon Jul 14 14:00:10 2025 +0800
Fix display of Blob type in last query
(cherry picked from commit b2cdbe03f77de38e58b3b8e1b4871ef526f9f19e)
---
.../db/it/last/IoTDBLastQueryLastCacheIT.java | 15 +++++++++-
.../protocol/thrift/impl/ClientRPCServiceImpl.java | 8 ++---
.../last/AlignedUpdateLastCacheOperator.java | 4 +--
.../AlignedUpdateViewPathLastCacheOperator.java | 4 +--
.../process/last/LastQueryTransformOperator.java | 4 +--
.../operator/process/last/LastQueryUtil.java | 34 ++++++++++++++++++++++
.../process/last/UpdateLastCacheOperator.java | 4 +--
.../last/UpdateViewPathLastCacheOperator.java | 4 +--
.../plan/planner/OperatorTreeGenerator.java | 8 ++---
9 files changed, 66 insertions(+), 19 deletions(-)
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
index 5c30e95e7bf..c4584f22fab 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
@@ -77,7 +77,9 @@ public class IoTDBLastQueryLastCacheIT {
"insert into root.ln_1.tb_6141(time,`switch_BOOLEAN`) aligned values(1675995566000,false);",
"create aligned timeseries root.sg(风机退出_BOOLEAN BOOLEAN encoding=RLE,`NH4-N_DOUBLE` DOUBLE encoding=GORILLA,膜产水状态_BOOLEAN BOOLEAN encoding=RLE,11_TEXT TEXT encoding=PLAIN,产水间歇运行时间设置_DOUBLE DOUBLE encoding=GORILLA,文本_TEXT TEXT encoding=PLAIN, 风机投入_BOOLEAN BOOLEAN encoding=RLE,枚举_INT32 INT32 encoding=RLE,出水TP_DOUBLE DOUBLE encoding=GORILLA,水管流速_DOUBLE DOUBLE encoding=GORILLA,CO2_DOUBLE DOUBLE encoding=GORILLA,`开关量-运行_BOOLEAN` BOOLEAN encoding=RLE,code_DOUBLE DOUBLE encoding=GORILLA);",
"insert into root.sg(time,code_DOUBLE) aligned values(1679477545000,2.0);",
- "insert into root.sg(time,`NH4-N_DOUBLE`) aligned values(1679365910000,12.0);"
+ "insert into root.sg(time,`NH4-N_DOUBLE`) aligned values(1679365910000,12.0);",
+ "create timeseries root.sg.d1.s1 with datatype=BLOB;",
+ "insert into root.sg.d1(time,s1) values(1,X'cafebabe')",
};
@BeforeClass
@@ -179,4 +181,15 @@ public class IoTDBLastQueryLastCacheIT {
expectedHeader,
retArray);
}
+
+ @Test
+ public void testLastQuerySortWithBlobType() {
+ String[] expectedHeader =
+ new String[] {TIMESTAMP_STR, TIMESERIES_STR, VALUE_STR, DATA_TYPE_STR};
+ String[] retArray =
+ new String[] {
+ "1,root.sg.d1.s1,0xcafebabe,BLOB,",
+ };
+ resultSetEqualTest("select last s1 from root.sg.d1;", expectedHeader, retArray);
+ }
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index b1ecfda15e3..12764b8e2ee 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -984,11 +984,11 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
device2MeasurementLastEntry.getValue().entrySet()) {
final TimeValuePair tvPair = measurementLastEntry.getValue().getRight();
if (tvPair != TableDeviceLastCache.EMPTY_TIME_VALUE_PAIR) {
- LastQueryUtil.appendLastValue(
+ LastQueryUtil.appendLastValueRespectBlob(
builder,
tvPair.getTimestamp(),
deviceWithSeparator + measurementLastEntry.getKey(),
- tvPair.getValue().getStringValue(),
+ tvPair.getValue(),
measurementLastEntry.getValue().getLeft().name());
}
}
@@ -1119,11 +1119,11 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
}
} else {
// we don't consider TTL
- LastQueryUtil.appendLastValue(
+ LastQueryUtil.appendLastValueRespectBlob(
builder,
timeValuePair.getTimestamp(),
new Binary(fullPath.getFullPath(), TSFileConfig.STRING_CHARSET),
- timeValuePair.getValue().getStringValue(),
+ timeValuePair.getValue(),
timeValuePair.getValue().getDataType().name());
}
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
index c7ae13af686..67aa5191db5 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
@@ -101,8 +101,8 @@ public class AlignedUpdateLastCacheOperator extends AbstractUpdateLastCacheOpera
protected void appendLastValueToTsBlockBuilder(
long lastTime, TsPrimitiveType lastValue, MeasurementPath measurementPath, String type) {
- LastQueryUtil.appendLastValue(
- tsBlockBuilder, lastTime, measurementPath.getFullPath(), lastValue.getStringValue(), type);
+ LastQueryUtil.appendLastValueRespectBlob(
+ tsBlockBuilder, lastTime, measurementPath.getFullPath(), lastValue, type);
}
@Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
index 5c5d4887c03..77902a10e37 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
@@ -58,8 +58,8 @@ public class AlignedUpdateViewPathLastCacheOperator extends AlignedUpdateLastCac
@Override
protected void appendLastValueToTsBlockBuilder(
long lastTime, TsPrimitiveType lastValue, MeasurementPath measurementPath, String type) {
- LastQueryUtil.appendLastValue(
- tsBlockBuilder, lastTime, outputViewPath, lastValue.getStringValue(), type);
+ LastQueryUtil.appendLastValueRespectBlob(
+ tsBlockBuilder, lastTime, outputViewPath, lastValue, type);
}
@Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
index 68b5227d726..88d67a21f97 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
@@ -74,11 +74,11 @@ public class LastQueryTransformOperator implements ProcessOperator {
if (tsBlock.getColumn(1).isNull(0)) {
return null;
}
- LastQueryUtil.appendLastValue(
+ LastQueryUtil.appendLastValueRespectBlob(
tsBlockBuilder,
tsBlock.getColumn(0).getLong(0),
viewPath,
- tsBlock.getColumn(1).getTsPrimitiveType(0).getStringValue(),
+ tsBlock.getColumn(1).getTsPrimitiveType(0),
dataType);
}
} else {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
index 481b8f27ddb..aadd9c8df38 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
@@ -36,6 +36,8 @@ import org.apache.tsfile.read.filter.basic.Filter;
import org.apache.tsfile.read.filter.operator.TimeFilterOperators.TimeGt;
import org.apache.tsfile.read.filter.operator.TimeFilterOperators.TimeGtEq;
import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.utils.BytesUtils;
+import org.apache.tsfile.utils.TsPrimitiveType;
import java.util.ArrayList;
import java.util.Collections;
@@ -65,6 +67,38 @@ public class LastQueryUtil {
return tsBlock.getColumn(0).getBinary(index);
}
+ public static void appendLastValueRespectBlob(
+ TsBlockBuilder builder,
+ long lastTime,
+ String fullPath,
+ TsPrimitiveType lastValue,
+ String dataType) {
+ appendLastValue(
+ builder,
+ lastTime,
+ fullPath,
+ dataType.equals(TSDataType.BLOB.name())
+ ? BytesUtils.parseBlobByteArrayToString(lastValue.getBinary().getValues())
+ : lastValue.getStringValue(),
+ dataType);
+ }
+
+ public static void appendLastValueRespectBlob(
+ TsBlockBuilder builder,
+ long lastTime,
+ Binary fullPath,
+ TsPrimitiveType lastValue,
+ String dataType) {
+ appendLastValue(
+ builder,
+ lastTime,
+ fullPath,
+ dataType.equals(TSDataType.BLOB.name())
+ ? BytesUtils.parseBlobByteArrayToString(lastValue.getBinary().getValues())
+ : lastValue.getStringValue(),
+ dataType);
+ }
+
public static void appendLastValue(
TsBlockBuilder builder, long lastTime, String fullPath, String lastValue, String dataType) {
// Time
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
index 0090446c4ec..36f71f03d55 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
@@ -115,8 +115,8 @@ public class UpdateLastCacheOperator extends AbstractUpdateLastCacheOperator {
}
protected void appendLastValueToTsBlockBuilder(long lastTime, TsPrimitiveType lastValue) {
- LastQueryUtil.appendLastValue(
- tsBlockBuilder, lastTime, fullPath.getFullPath(), lastValue.getStringValue(), dataType);
+ LastQueryUtil.appendLastValueRespectBlob(
+ tsBlockBuilder, lastTime, fullPath.getFullPath(), lastValue, dataType);
}
@Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
index aa4b35b9f83..84f8dd40b12 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
@@ -54,8 +54,8 @@ public class UpdateViewPathLastCacheOperator extends UpdateLastCacheOperator {
@Override
protected void appendLastValueToTsBlockBuilder(long lastTime, TsPrimitiveType lastValue) {
- LastQueryUtil.appendLastValue(
- tsBlockBuilder, lastTime, outputViewPath, lastValue.getStringValue(), dataType);
+ LastQueryUtil.appendLastValueRespectBlob(
+ tsBlockBuilder, lastTime, outputViewPath, lastValue, dataType);
}
@Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index 82a6cea7448..a6a79247b0a 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -3106,11 +3106,11 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
TsBlockBuilder builder = LastQueryUtil.createTsBlockBuilder(initSize);
for (int i = 0; i < initSize; i++) {
TimeValuePair timeValuePair = cachedLastValueAndPathList.get(i).left;
- LastQueryUtil.appendLastValue(
+ LastQueryUtil.appendLastValueRespectBlob(
builder,
timeValuePair.getTimestamp(),
cachedLastValueAndPathList.get(i).right,
- timeValuePair.getValue().getStringValue(),
+ timeValuePair.getValue(),
timeValuePair.getValue().getDataType().name());
}
OperatorContext operatorContext =
@@ -3133,11 +3133,11 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP
TsBlockBuilder builder = LastQueryUtil.createTsBlockBuilder(initSize);
for (int i = 0; i < initSize; i++) {
TimeValuePair timeValuePair = cachedLastValueAndPathList.get(i).left;
- LastQueryUtil.appendLastValue(
+ LastQueryUtil.appendLastValueRespectBlob(
builder,
timeValuePair.getTimestamp(),
cachedLastValueAndPathList.get(i).right,
- timeValuePair.getValue().getStringValue(),
+ timeValuePair.getValue(),
timeValuePair.getValue().getDataType().name());
}