From ba238d61f3d655362e2aaf7c30ec09dd9742ec2d Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 31 Mar 2025 15:23:16 +0300 Subject: [PATCH 1/3] fixed issue with comparing different data point types --- .../thingsboard/server/edqs/data/dp/BoolDataPoint.java | 7 ++++++- .../thingsboard/server/edqs/data/dp/DoubleDataPoint.java | 6 +++++- .../thingsboard/server/edqs/data/dp/LongDataPoint.java | 8 +++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java index 70a14917ba..97a0a265d5 100644 --- a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java +++ b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java @@ -16,6 +16,7 @@ package org.thingsboard.server.edqs.data.dp; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import org.thingsboard.server.common.data.edqs.DataPoint; import org.thingsboard.server.common.data.kv.DataType; @@ -46,6 +47,10 @@ public class BoolDataPoint extends AbstractDataPoint { @Override public int compareTo(DataPoint dataPoint) { - return Boolean.compare(value, dataPoint.getBool()); + if (dataPoint.getType() == DataType.BOOLEAN) { + return StringUtils.compareIgnoreCase(valueToString(), dataPoint.valueToString()); + } else { + return super.compareTo(dataPoint); + } } } diff --git a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/DoubleDataPoint.java b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/DoubleDataPoint.java index 2ca8f2c03a..4660b3eb56 100644 --- a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/DoubleDataPoint.java +++ b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/DoubleDataPoint.java @@ -46,6 +46,10 @@ public class DoubleDataPoint extends AbstractDataPoint { @Override public int compareTo(DataPoint dataPoint) { - return Double.compare(value, dataPoint.getDouble()); + if (dataPoint.getType() == DataType.DOUBLE || dataPoint.getType() == DataType.LONG) { + return Double.compare(value, dataPoint.getDouble()); + } else { + return super.compareTo(dataPoint); + } } } diff --git a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/LongDataPoint.java b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/LongDataPoint.java index 92c0a972e7..a1d33203b7 100644 --- a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/LongDataPoint.java +++ b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/LongDataPoint.java @@ -51,6 +51,12 @@ public class LongDataPoint extends AbstractDataPoint { @Override public int compareTo(DataPoint dataPoint) { - return Long.compare(value, dataPoint.getLong()); + if (dataPoint.getType() == DataType.DOUBLE) { + return Double.compare(getDouble(), dataPoint.getDouble()); + } else if (dataPoint.getType() == DataType.LONG) { + return Long.compare(value, dataPoint.getLong()); + } else { + return super.compareTo(dataPoint); + } } } From dbd74a8b4c54d1a9ed4e413d0ccc80a1972e3f57 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 1 Apr 2025 16:20:50 +0300 Subject: [PATCH 2/3] added test --- .../service/entitiy/EntityServiceTest.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java b/application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java index e5c4009715..a2c3fc07c8 100644 --- a/application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java @@ -95,7 +95,6 @@ import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entity.EntityService; import org.thingsboard.server.dao.entityview.EntityViewDao; import org.thingsboard.server.dao.entityview.EntityViewService; -import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.sql.relation.RelationRepository; @@ -1664,7 +1663,7 @@ public class EntityServiceTest extends AbstractControllerTest { List> timeseriesFutures = new ArrayList<>(); for (int i = 0; i < devices.size(); i++) { Device device = devices.get(i); - timeseriesFutures.add(saveLongTimeseries(device.getId(), "temperature", temperatures.get(i))); + timeseriesFutures.add(saveTimeseries(device.getId(), "temperature", temperatures.get(i))); } Futures.allAsList(timeseriesFutures).get(); @@ -1711,6 +1710,13 @@ public class EntityServiceTest extends AbstractControllerTest { List entitiesTelemetry = loadedEntities.stream().map(entityData -> entityData.getLatest().get(EntityKeyType.TIME_SERIES).get("temperature").getValue()).toList(); assertThat(entitiesTelemetry).containsExactlyElementsOf(expectedSortedList); + // update temperature to long value for one of device + long longTempValue = -100L; + saveTimeseries(devices.get(new Random().nextInt(66)).getId(), "temperature", longTempValue).get(); + loadedEntities = loadAllData(querySortByTemp, deviceTemperatures.size()); + entitiesTelemetry = loadedEntities.stream().map(entityData -> entityData.getLatest().get(EntityKeyType.TIME_SERIES).get("temperature").getValue()).toList(); + assertThat(entitiesTelemetry.get(0)).isEqualTo(String.valueOf(longTempValue)); + deviceService.deleteDevicesByTenantId(tenantId); } @@ -2252,15 +2258,18 @@ public class EntityServiceTest extends AbstractControllerTest { return attributesService.save(tenantId, entityId, scope, Collections.singletonList(attr)); } - private ListenableFuture saveLongTimeseries(EntityId entityId, String key, Double value) { - TsKvEntity tsKv = new TsKvEntity(); - tsKv.setStrKey(key); - tsKv.setDoubleValue(value); + private ListenableFuture saveTimeseries(EntityId entityId, String key, Double value) { KvEntry telemetryValue = new DoubleDataEntry(key, value); BasicTsKvEntry timeseries = new BasicTsKvEntry(42L, telemetryValue); return timeseriesService.save(tenantId, entityId, timeseries); } + private ListenableFuture saveTimeseries(EntityId entityId, String key, Long value) { + KvEntry telemetryValue = new LongDataEntry(key, value); + BasicTsKvEntry timeseries = new BasicTsKvEntry(42L, telemetryValue); + return timeseriesService.save(tenantId, entityId, timeseries); + } + protected void createMultiRootHierarchy(List buildings, List apartments, Map> entityNameByTypeMap, Map childParentRelationMap) throws InterruptedException { From cf405c32e78215686341d553c2028bd6b65605fd Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 1 Apr 2025 16:37:31 +0300 Subject: [PATCH 3/3] fixed BoolDataPoint compare method --- .../org/thingsboard/server/edqs/data/dp/BoolDataPoint.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java index 97a0a265d5..adb03a5cb1 100644 --- a/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java +++ b/common/edqs/src/main/java/org/thingsboard/server/edqs/data/dp/BoolDataPoint.java @@ -16,7 +16,6 @@ package org.thingsboard.server.edqs.data.dp; import lombok.Getter; -import org.apache.commons.lang3.StringUtils; import org.thingsboard.server.common.data.edqs.DataPoint; import org.thingsboard.server.common.data.kv.DataType; @@ -48,7 +47,7 @@ public class BoolDataPoint extends AbstractDataPoint { @Override public int compareTo(DataPoint dataPoint) { if (dataPoint.getType() == DataType.BOOLEAN) { - return StringUtils.compareIgnoreCase(valueToString(), dataPoint.valueToString()); + return Boolean.compare(value, dataPoint.getBool()); } else { return super.compareTo(dataPoint); }