From 4525174b0efd7fdcf328489b563c2a6eabec88da Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Tue, 18 Jul 2017 17:06:59 +0300 Subject: [PATCH] Aggregation function fixes to the SQL DAO layer --- .../server/dao/model/sql/TsKvEntity.java | 8 +++++- .../dao/sql/timeseries/TsKvRepository.java | 27 +++++++++++-------- .../telemetry/sub/SubscriptionUpdate.java | 6 +---- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TsKvEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TsKvEntity.java index c5739f18fe..74356ad601 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TsKvEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TsKvEntity.java @@ -34,7 +34,9 @@ public final class TsKvEntity implements ToData { } public TsKvEntity(Double avgLongValue, Double avgDoubleValue) { - this.longValue = avgLongValue.longValue(); + if(avgLongValue != null) { + this.longValue = avgLongValue.longValue(); + } this.doubleValue = avgDoubleValue; } @@ -104,4 +106,8 @@ public final class TsKvEntity implements ToData { } return new BasicTsKvEntry(ts, kvEntry); } + + public boolean isNotEmpty() { + return strValue != null || longValue != null || doubleValue != null || booleanValue != null; + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/TsKvRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/TsKvRepository.java index 2c7751d0d1..b37d27218b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/TsKvRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/TsKvRepository.java @@ -19,12 +19,14 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; +import org.springframework.scheduling.annotation.Async; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.dao.model.sql.TsKvCompositeKey; import org.thingsboard.server.dao.model.sql.TsKvEntity; import org.thingsboard.server.dao.util.SqlDao; import java.util.List; +import java.util.concurrent.Future; @SqlDao public interface TsKvRepository extends CrudRepository { @@ -39,49 +41,52 @@ public interface TsKvRepository extends CrudRepository :startTs AND tskv.ts < :endTs") - TsKvEntity findMax(@Param("entityId") String entityId, + Future findMax(@Param("entityId") String entityId, @Param("entityType") EntityType entityType, @Param("entityKey") String entityKey, @Param("startTs") long startTs, @Param("endTs") long endTs); + @Async @Query("SELECT new TsKvEntity(MIN(tskv.strValue), MIN(tskv.longValue), MIN(tskv.doubleValue)) FROM TsKvEntity tskv " + "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " + "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs") - TsKvEntity findMin(@Param("entityId") String entityId, + Future findMin(@Param("entityId") String entityId, @Param("entityType") EntityType entityType, @Param("entityKey") String entityKey, @Param("startTs") long startTs, @Param("endTs") long endTs); - + @Async @Query("SELECT new TsKvEntity(COUNT(tskv.booleanValue), COUNT(tskv.strValue), COUNT(tskv.longValue), COUNT(tskv.doubleValue)) FROM TsKvEntity tskv " + "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " + "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs") - TsKvEntity findCount(@Param("entityId") String entityId, - @Param("entityType") EntityType entityType, - @Param("entityKey") String entityKey, - @Param("startTs") long startTs, - @Param("endTs") long endTs); - + Future findCount(@Param("entityId") String entityId, + @Param("entityType") EntityType entityType, + @Param("entityKey") String entityKey, + @Param("startTs") long startTs, + @Param("endTs") long endTs); + @Async @Query("SELECT new TsKvEntity(AVG(tskv.longValue), AVG(tskv.doubleValue)) FROM TsKvEntity tskv " + "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " + "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs") - TsKvEntity findAvg(@Param("entityId") String entityId, + Future findAvg(@Param("entityId") String entityId, @Param("entityType") EntityType entityType, @Param("entityKey") String entityKey, @Param("startTs") long startTs, @Param("endTs") long endTs); + @Async @Query("SELECT new TsKvEntity(SUM(tskv.longValue), SUM(tskv.doubleValue)) FROM TsKvEntity tskv " + "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " + "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs") - TsKvEntity findSum(@Param("entityId") String entityId, + Future findSum(@Param("entityId") String entityId, @Param("entityType") EntityType entityType, @Param("entityKey") String entityKey, @Param("startTs") long startTs, diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/plugin/telemetry/sub/SubscriptionUpdate.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/plugin/telemetry/sub/SubscriptionUpdate.java index 4d8cf5310e..618ddc7c43 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/plugin/telemetry/sub/SubscriptionUpdate.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/plugin/telemetry/sub/SubscriptionUpdate.java @@ -32,11 +32,7 @@ public class SubscriptionUpdate { this.subscriptionId = subscriptionId; this.data = new TreeMap<>(); for (TsKvEntry tsEntry : data) { - List values = this.data.get(tsEntry.getKey()); - if (values == null) { - values = new ArrayList<>(); - this.data.put(tsEntry.getKey(), values); - } + List values = this.data.computeIfAbsent(tsEntry.getKey(), k -> new ArrayList<>()); Object[] value = new Object[2]; value[0] = tsEntry.getTs(); value[1] = tsEntry.getValueAsString();