Commit 4525174b0efd7fdcf328489b563c2a6eabec88da

Authored by Andrew Shvayka
1 parent ea0e59f7

Aggregation function fixes to the SQL DAO layer

... ... @@ -34,7 +34,9 @@ public final class TsKvEntity implements ToData<TsKvEntry> {
34 34 }
35 35
36 36 public TsKvEntity(Double avgLongValue, Double avgDoubleValue) {
37   - this.longValue = avgLongValue.longValue();
  37 + if(avgLongValue != null) {
  38 + this.longValue = avgLongValue.longValue();
  39 + }
38 40 this.doubleValue = avgDoubleValue;
39 41 }
40 42
... ... @@ -104,4 +106,8 @@ public final class TsKvEntity implements ToData<TsKvEntry> {
104 106 }
105 107 return new BasicTsKvEntry(ts, kvEntry);
106 108 }
  109 +
  110 + public boolean isNotEmpty() {
  111 + return strValue != null || longValue != null || doubleValue != null || booleanValue != null;
  112 + }
107 113 }
... ...
... ... @@ -19,12 +19,14 @@ import org.springframework.data.domain.Pageable;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21 21 import org.springframework.data.repository.query.Param;
  22 +import org.springframework.scheduling.annotation.Async;
22 23 import org.thingsboard.server.common.data.EntityType;
23 24 import org.thingsboard.server.dao.model.sql.TsKvCompositeKey;
24 25 import org.thingsboard.server.dao.model.sql.TsKvEntity;
25 26 import org.thingsboard.server.dao.util.SqlDao;
26 27
27 28 import java.util.List;
  29 +import java.util.concurrent.Future;
28 30
29 31 @SqlDao
30 32 public interface TsKvRepository extends CrudRepository<TsKvEntity, TsKvCompositeKey> {
... ... @@ -39,49 +41,52 @@ public interface TsKvRepository extends CrudRepository<TsKvEntity, TsKvComposite
39 41 @Param("endTs") long endTs,
40 42 Pageable pageable);
41 43
  44 + @Async
42 45 @Query("SELECT new TsKvEntity(MAX(tskv.strValue), MAX(tskv.longValue), MAX(tskv.doubleValue)) FROM TsKvEntity tskv " +
43 46 "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
44 47 "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
45   - TsKvEntity findMax(@Param("entityId") String entityId,
  48 + Future<TsKvEntity> findMax(@Param("entityId") String entityId,
46 49 @Param("entityType") EntityType entityType,
47 50 @Param("entityKey") String entityKey,
48 51 @Param("startTs") long startTs,
49 52 @Param("endTs") long endTs);
50 53
  54 + @Async
51 55 @Query("SELECT new TsKvEntity(MIN(tskv.strValue), MIN(tskv.longValue), MIN(tskv.doubleValue)) FROM TsKvEntity tskv " +
52 56 "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
53 57 "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
54   - TsKvEntity findMin(@Param("entityId") String entityId,
  58 + Future<TsKvEntity> findMin(@Param("entityId") String entityId,
55 59 @Param("entityType") EntityType entityType,
56 60 @Param("entityKey") String entityKey,
57 61 @Param("startTs") long startTs,
58 62 @Param("endTs") long endTs);
59 63
60   -
  64 + @Async
61 65 @Query("SELECT new TsKvEntity(COUNT(tskv.booleanValue), COUNT(tskv.strValue), COUNT(tskv.longValue), COUNT(tskv.doubleValue)) FROM TsKvEntity tskv " +
62 66 "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
63 67 "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
64   - TsKvEntity findCount(@Param("entityId") String entityId,
65   - @Param("entityType") EntityType entityType,
66   - @Param("entityKey") String entityKey,
67   - @Param("startTs") long startTs,
68   - @Param("endTs") long endTs);
69   -
  68 + Future<TsKvEntity> findCount(@Param("entityId") String entityId,
  69 + @Param("entityType") EntityType entityType,
  70 + @Param("entityKey") String entityKey,
  71 + @Param("startTs") long startTs,
  72 + @Param("endTs") long endTs);
70 73
  74 + @Async
71 75 @Query("SELECT new TsKvEntity(AVG(tskv.longValue), AVG(tskv.doubleValue)) FROM TsKvEntity tskv " +
72 76 "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
73 77 "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
74   - TsKvEntity findAvg(@Param("entityId") String entityId,
  78 + Future<TsKvEntity> findAvg(@Param("entityId") String entityId,
75 79 @Param("entityType") EntityType entityType,
76 80 @Param("entityKey") String entityKey,
77 81 @Param("startTs") long startTs,
78 82 @Param("endTs") long endTs);
79 83
80 84
  85 + @Async
81 86 @Query("SELECT new TsKvEntity(SUM(tskv.longValue), SUM(tskv.doubleValue)) FROM TsKvEntity tskv " +
82 87 "WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
83 88 "AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
84   - TsKvEntity findSum(@Param("entityId") String entityId,
  89 + Future<TsKvEntity> findSum(@Param("entityId") String entityId,
85 90 @Param("entityType") EntityType entityType,
86 91 @Param("entityKey") String entityKey,
87 92 @Param("startTs") long startTs,
... ...
... ... @@ -32,11 +32,7 @@ public class SubscriptionUpdate {
32 32 this.subscriptionId = subscriptionId;
33 33 this.data = new TreeMap<>();
34 34 for (TsKvEntry tsEntry : data) {
35   - List<Object> values = this.data.get(tsEntry.getKey());
36   - if (values == null) {
37   - values = new ArrayList<>();
38   - this.data.put(tsEntry.getKey(), values);
39   - }
  35 + List<Object> values = this.data.computeIfAbsent(tsEntry.getKey(), k -> new ArrayList<>());
40 36 Object[] value = new Object[2];
41 37 value[0] = tsEntry.getTs();
42 38 value[1] = tsEntry.getValueAsString();
... ...