Browse Source

improved sql-query, improved variable naming

pull/12037/head
dashevchenko 2 years ago
parent
commit
ec7e615559
  1. 32
      application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java
  2. 20
      application/src/main/java/org/thingsboard/server/service/subscription/TbAlarmStatusSubscription.java
  3. 10
      application/src/main/java/org/thingsboard/server/service/ws/telemetry/cmd/v2/AlarmStatusUpdate.java
  4. 33
      application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java
  5. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java
  6. 2
      dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java
  7. 4
      dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
  8. 63
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
  9. 7
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java

32
application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java

@ -38,7 +38,6 @@ import org.thingsboard.server.common.data.kv.ReadTsKvQuery;
import org.thingsboard.server.common.data.kv.ReadTsKvQueryResult;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.query.AlarmDataQuery;
import org.thingsboard.server.common.data.query.ComparisonTsValue;
import org.thingsboard.server.common.data.query.OriginatorAlarmFilter;
@ -468,10 +467,10 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
private void fetchActiveAlarms(TbAlarmStatusSubscription subscription) {
log.trace("[{}, subId: {}] Fetching active alarms from DB", subscription.getSessionId(), subscription.getSubscriptionId());
OriginatorAlarmFilter originatorAlarmFilter = new OriginatorAlarmFilter(subscription.getEntityId(), subscription.getTypeList(), subscription.getSeverityList());
List<UUID> alarmIds = alarmService.findActiveOriginatorAlarms(subscription.getTenantId(), originatorAlarmFilter, new PageLink(alarmsPerAlarmStatusSubscriptionCacheSize)).getData();
List<UUID> alarmIds = alarmService.findActiveOriginatorAlarms(subscription.getTenantId(), originatorAlarmFilter, alarmsPerAlarmStatusSubscriptionCacheSize);
subscription.getAlarmIds().addAll(alarmIds);
subscription.setExceededLimit(alarmIds.size() == alarmsPerAlarmStatusSubscriptionCacheSize);
subscription.setFullCache(alarmIds.size() == alarmsPerAlarmStatusSubscriptionCacheSize);
}
private void sendUpdate(String sessionId, CmdUpdate update) {
@ -485,12 +484,12 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
AlarmInfo alarm = subscriptionUpdate.getAlarm();
Set<UUID> alarmsIds = subscription.getAlarmIds();
if (alarmsIds.contains(alarm.getId().getId())) {
if (!alarmMatchesSubscription(alarm, subscription) || subscriptionUpdate.isAlarmDeleted()) {
if (!subscription.matches(alarm) || subscriptionUpdate.isAlarmDeleted()) {
alarmsIds.remove(alarm.getId().getId());
if (alarmsIds.size() == 0) {
if (subscription.isExceededLimit()) {
if (alarmsIds.isEmpty()) {
if (subscription.isFullCache()) {
fetchActiveAlarms(subscription);
if (alarmsIds.size() == 0) {
if (alarmsIds.isEmpty()) {
sendUpdate(subscription.getSessionId(), subscription.createUpdate());
}
} else {
@ -498,10 +497,14 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
}
}
}
} else if (alarmMatchesSubscription(alarm, subscription) && (alarmsIds.size() < alarmsPerAlarmStatusSubscriptionCacheSize)) {
alarmsIds.add(alarm.getId().getId());
if (alarmsIds.size() == 1) {
sendUpdate(subscription.getSessionId(), subscription.createUpdate());
} else if (subscription.matches(alarm)) {
if (alarmsIds.size() < alarmsPerAlarmStatusSubscriptionCacheSize) {
alarmsIds.add(alarm.getId().getId());
if (alarmsIds.size() == 1) {
sendUpdate(subscription.getSessionId(), subscription.createUpdate());
}
} else {
subscription.setFullCache(true);
}
}
} catch (Exception e) {
@ -509,11 +512,6 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
}
}
private boolean alarmMatchesSubscription(AlarmInfo alarm, TbAlarmStatusSubscription subscription) {
return !alarm.isCleared() && (subscription.getTypeList() == null || subscription.getTypeList().contains(alarm.getType())) &&
(subscription.getSeverityList() == null || subscription.getSeverityList().contains(alarm.getSeverity()));
}
private boolean validate(TbAbstractSubCtx<?> finalCtx) {
if (finalCtx.isStopped()) {
log.warn("[{}][{}][{}] Received validation task for already stopped context.", finalCtx.getTenantId(), finalCtx.getSessionId(), finalCtx.getCmdId());
@ -607,7 +605,7 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc
return ctx;
}
private TbAlarmCountSubCtx createSubCtx(WebSocketSessionRef sessionRef, AlarmCountCmd cmd) {
private TbAlarmCountSubCtx createSubCtx(WebSocketSessionRef sessionRef, AlarmCountCmd cmd) {
Map<Integer, TbAbstractSubCtx> sessionSubs = subscriptionsBySessionId.computeIfAbsent(sessionRef.getSessionId(), k -> new ConcurrentHashMap<>());
TbAlarmCountSubCtx ctx = new TbAlarmCountSubCtx(serviceId, wsService, entityService, localSubscriptionService,
attributesService, stats, alarmService, sessionRef, cmd.getCmdId());

20
application/src/main/java/org/thingsboard/server/service/subscription/TbAlarmStatusSubscription.java

@ -18,6 +18,7 @@ package org.thingsboard.server.service.subscription;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
@ -37,7 +38,7 @@ public class TbAlarmStatusSubscription extends TbSubscription<AlarmSubscriptionU
private final Set<UUID> alarmIds = new HashSet<>();
@Getter
@Setter
private boolean exceededLimit;
private boolean fullCache;
@Getter
private final List<String> typeList;
@Getter
@ -52,20 +53,15 @@ public class TbAlarmStatusSubscription extends TbSubscription<AlarmSubscriptionU
this.severityList = severityList;
}
@Override
public boolean equals(Object o) {
return super.equals(o);
}
@Override
public int hashCode() {
return super.hashCode();
}
public AlarmStatusUpdate createUpdate() {
return AlarmStatusUpdate.builder()
.cmdId(getSubscriptionId())
.present(alarmIds.size() > 0)
.active(alarmIds.size() > 0)
.build();
}
public boolean matches(AlarmInfo alarm) {
return !alarm.isCleared() && (this.typeList == null || this.typeList.contains(alarm.getType())) &&
(this.severityList == null || this.severityList.contains(alarm.getSeverity()));
}
}

10
application/src/main/java/org/thingsboard/server/service/ws/telemetry/cmd/v2/AlarmStatusUpdate.java

@ -26,11 +26,11 @@ import org.thingsboard.server.service.subscription.SubscriptionErrorCode;
public class AlarmStatusUpdate extends CmdUpdate {
@Getter
private boolean present;
private boolean active;
public AlarmStatusUpdate(int cmdId, boolean present) {
public AlarmStatusUpdate(int cmdId, boolean active) {
super(cmdId, SubscriptionErrorCode.NO_ERROR.getCode(), null);
this.present = present;
this.active = active;
}
public AlarmStatusUpdate(int cmdId, int errorCode, String errorMsg) {
@ -39,11 +39,11 @@ public class AlarmStatusUpdate extends CmdUpdate {
@Builder
public AlarmStatusUpdate(@JsonProperty("cmdId") int cmdId,
@JsonProperty("present") boolean present,
@JsonProperty("present") boolean active,
@JsonProperty("errorCode") int errorCode,
@JsonProperty("errorMsg") String errorMsg) {
super(cmdId, errorCode, errorMsg);
this.present = present;
this.active = active;
}
@Override

33
application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java

@ -332,7 +332,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate update = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(1, update.getCmdId());
Assert.assertFalse(update.isPresent());
Assert.assertFalse(update.isActive());
//create alarm
getWsClient().registerWaitForUpdate();
@ -346,7 +346,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate alarmStatusUpdate = JacksonUtil.fromString(getWsClient().waitForUpdate(), AlarmStatusUpdate.class);
Assert.assertEquals(1, update.getCmdId());
Assert.assertTrue(alarmStatusUpdate.isPresent());
Assert.assertTrue(alarmStatusUpdate.isActive());
//clear alarm
getWsClient().registerWaitForUpdate();
@ -358,7 +358,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate alarmStatusUpdate2 = JacksonUtil.fromString(getWsClient().waitForUpdate(), AlarmStatusUpdate.class);
Assert.assertEquals(1, alarmStatusUpdate2.getCmdId());
Assert.assertFalse(alarmStatusUpdate2.isPresent());
Assert.assertFalse(alarmStatusUpdate2.isActive());
// add second type alarm
getWsClient().registerWaitForUpdate();
@ -372,7 +372,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate alarmStatusUpdate3 = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(1, alarmStatusUpdate3.getCmdId());
Assert.assertTrue(alarmStatusUpdate3.isPresent());
Assert.assertTrue(alarmStatusUpdate3.isActive());
//change severity
alarm2.setSeverity(AlarmSeverity.MAJOR);
@ -382,7 +382,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate alarmStatusUpdate4 = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(1, alarmStatusUpdate4.getCmdId());
Assert.assertFalse(alarmStatusUpdate4.isPresent());
Assert.assertFalse(alarmStatusUpdate4.isActive());
//subscribe for critical alarms
AlarmStatusCmd cmd3 = new AlarmStatusCmd(2, device.getId(), List.of("TEST ALARM"), List.of(AlarmSeverity.CRITICAL));
@ -391,13 +391,22 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate alarmStatusUpdate5 = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(2, alarmStatusUpdate5.getCmdId());
Assert.assertFalse(alarmStatusUpdate5.isPresent());
Assert.assertFalse(alarmStatusUpdate5.isActive());
}
@Test
public void testAlarmStatusWsCmdWithMaxAlarmsCacheSize() throws Exception {
loginTenantAdmin();
AlarmStatusCmd cmd = new AlarmStatusCmd(1, device.getId(), null, List.of(AlarmSeverity.CRITICAL));
getWsClient().send(cmd);
AlarmStatusUpdate update = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(1, update.getCmdId());
Assert.assertFalse(update.isActive());
getWsClient().registerWaitForUpdate();
//create 5+1 alarms
List<Alarm> alarms = new ArrayList<>();
for (int i = 0; i < 6; i++) {
@ -409,13 +418,9 @@ public class WebsocketApiTest extends AbstractControllerTest {
alarms.add(alarm);
}
AlarmStatusCmd cmd = new AlarmStatusCmd(1, device.getId(), null, List.of(AlarmSeverity.CRITICAL));
getWsClient().send(cmd);
AlarmStatusUpdate update = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(1, update.getCmdId());
Assert.assertTrue(update.isPresent());
AlarmStatusUpdate updateAfterAlarmsAdded = JacksonUtil.fromString(getWsClient().waitForReply(), AlarmStatusUpdate.class);
Assert.assertEquals(1, updateAfterAlarmsAdded.getCmdId());
Assert.assertTrue(updateAfterAlarmsAdded.isActive());
getWsClient().registerWaitForUpdate();
//clear first 5 alarms
@ -432,7 +437,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
AlarmStatusUpdate alarmStatusUpdate2 = JacksonUtil.fromString(getWsClient().waitForUpdate(), AlarmStatusUpdate.class);
Assert.assertEquals(1, alarmStatusUpdate2.getCmdId());
Assert.assertFalse(alarmStatusUpdate2.isPresent());
Assert.assertFalse(alarmStatusUpdate2.isActive());
}
@Test

2
common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java

@ -120,6 +120,6 @@ public interface AlarmService extends EntityDaoService {
PageData<EntitySubtype> findAlarmTypesByTenantId(TenantId tenantId, PageLink pageLink);
PageData<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink);
List<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, int limit);
}

2
dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java

@ -112,6 +112,6 @@ public interface AlarmDao extends Dao<Alarm> {
boolean removeAlarmTypesIfNoAlarmsPresent(UUID tenantId, Set<String> types);
PageData<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink);
List<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, int limit);
}

4
dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java

@ -367,9 +367,9 @@ public class BaseAlarmService extends AbstractCachedEntityService<TenantId, Page
}
@Override
public PageData<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink) {
public List<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, int limit) {
log.trace("Executing findActiveOriginatorAlarms, tenantId [{}], originatorAlarmFilter [{}]", tenantId, originatorAlarmFilter);
return alarmDao.findActiveOriginatorAlarms(tenantId, originatorAlarmFilter, pageLink);
return alarmDao.findActiveOriginatorAlarms(tenantId, originatorAlarmFilter, limit);
}
private Alarm merge(Alarm existing, Alarm alarm) {

63
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java

@ -101,8 +101,10 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
"AND ea.entityType = :affectedEntityType " +
"AND (:startTime IS NULL OR (a.createdTime >= :startTime AND ea.createdTime >= :startTime)) " +
"AND (:endTime IS NULL OR (a.createdTime <= :endTime AND ea.createdTime <= :endTime)) " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:#{#alarmTypes == null} = true) OR a.type IN (:alarmTypes)) " + //HHH-15968
"AND ((:#{#alarmSeverities == null} = true) OR a.severity IN (:alarmSeverities)) " + //HHH-15968
// "AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
// "AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:clearFilterEnabled) = FALSE OR a.cleared = :clearFilter) " +
"AND ((:ackFilterEnabled) = FALSE OR a.acknowledged = :ackFilter) " +
"AND (:assigneeId IS NULL OR a.assigneeId = :assigneeId) " +
@ -120,8 +122,10 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
"AND ea.entityType = :affectedEntityType " +
"AND (:startTime IS NULL OR (a.createdTime >= :startTime AND ea.createdTime >= :startTime)) " +
"AND (:endTime IS NULL OR (a.createdTime <= :endTime AND ea.createdTime <= :endTime)) " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:#{#alarmTypes == null} = true) OR a.type IN (:alarmTypes)) " + //HHH-15968
"AND ((:#{#alarmSeverities == null} = true) OR a.severity IN (:alarmSeverities)) " + //HHH-15968
// "AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
// "AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:clearFilterEnabled) = FALSE OR a.cleared = :clearFilter) " +
"AND ((:ackFilterEnabled) = FALSE OR a.acknowledged = :ackFilter) " +
"AND (:assigneeId IS NULL OR a.assigneeId = :assigneeId) " +
@ -182,8 +186,10 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
"WHERE a.tenantId = :tenantId " +
"AND (:startTime IS NULL OR a.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR a.createdTime <= :endTime) " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:#{#alarmTypes == null} = true) OR a.type IN (:alarmTypes)) " + //HHH-15968
"AND ((:#{#alarmSeverities == null} = true) OR a.severity IN (:alarmSeverities)) " + //HHH-15968
// "AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
// "AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:clearFilterEnabled) = FALSE OR a.cleared = :clearFilter) " +
"AND ((:ackFilterEnabled) = FALSE OR a.acknowledged = :ackFilter) " +
"AND (:assigneeId IS NULL OR a.assigneeId = :assigneeId) " +
@ -196,8 +202,10 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
"WHERE a.tenantId = :tenantId " +
"AND (:startTime IS NULL OR a.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR a.createdTime <= :endTime) " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:#{#alarmTypes == null} = true) OR a.type IN (:alarmTypes)) " + //HHH-15968
"AND ((:#{#alarmSeverities == null} = true) OR a.severity IN (:alarmSeverities)) " + //HHH-15968
// "AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
// "AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:clearFilterEnabled) = FALSE OR a.cleared = :clearFilter) " +
"AND ((:ackFilterEnabled) = FALSE OR a.acknowledged = :ackFilter) " +
"AND (:assigneeId IS NULL OR a.assigneeId = :assigneeId) " +
@ -258,8 +266,10 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
"WHERE a.tenantId = :tenantId AND a.customerId = :customerId " +
"AND (:startTime IS NULL OR a.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR a.createdTime <= :endTime) " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:#{#alarmTypes == null} = true) OR a.type IN (:alarmTypes)) " + //HHH-15968
"AND ((:#{#alarmSeverities == null} = true) OR a.severity IN (:alarmSeverities)) " + //HHH-15968
// "AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
// "AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:clearFilterEnabled) = FALSE OR a.cleared = :clearFilter) " +
"AND ((:ackFilterEnabled) = FALSE OR a.acknowledged = :ackFilter) " +
"AND (:assigneeId IS NULL OR a.assigneeId = :assigneeId) " +
@ -273,8 +283,10 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
"WHERE a.tenantId = :tenantId AND a.customerId = :customerId " +
"AND (:startTime IS NULL OR a.createdTime >= :startTime) " +
"AND (:endTime IS NULL OR a.createdTime <= :endTime) " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:#{#alarmTypes == null} = true) OR a.type IN (:alarmTypes)) " + //HHH-15968
"AND ((:#{#alarmSeverities == null} = true) OR a.severity IN (:alarmSeverities)) " + //HHH-15968
// "AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
// "AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND ((:clearFilterEnabled) = FALSE OR a.cleared = :clearFilter) " +
"AND ((:ackFilterEnabled) = FALSE OR a.acknowledged = :ackFilter) " +
"AND (:assigneeId IS NULL OR a.assigneeId = :assigneeId) " +
@ -392,25 +404,14 @@ public interface AlarmRepository extends JpaRepository<AlarmEntity, UUID> {
@Query(value = "DELETE FROM alarm_types AS at WHERE NOT EXISTS (SELECT 1 FROM alarm AS a WHERE a.tenant_id = at.tenant_id AND a.type = at.type) AND at.tenant_id = :tenantId AND at.type IN (:types)", nativeQuery = true)
int deleteTypeIfNoAlarmsExist(@Param("tenantId") UUID tenantId, @Param("types") Set<String> types);
@Query(value = "SELECT a.id " +
"FROM AlarmEntity a " +
"WHERE a.tenantId = :tenantId " +
"AND a.originatorId = :originatorId " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND (a.cleared = false)",
countQuery = "" +
"SELECT count(a) " +
"FROM AlarmEntity a " +
"WHERE a.tenantId = :tenantId " +
"AND a.originatorId = :originatorId " +
"AND ((:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND ((:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND (a.cleared = false)")
Page<UUID> findActiveOriginatorAlarms(@Param("tenantId") UUID tenantId,
@Param("originatorId") UUID originatorId,
@Query(value = "SELECT a.id FROM alarm a " +
"WHERE a.originator_id = :originatorId " +
"AND (COALESCE(:alarmTypes) IS NULL OR a.type IN (:alarmTypes)) " +
"AND (COALESCE(:alarmSeverities) IS NULL OR a.severity IN (:alarmSeverities)) " +
"AND (a.cleared = false) LIMIT :limit", nativeQuery = true)
List<UUID> findActiveOriginatorAlarms(@Param("originatorId") UUID originatorId,
@Param("alarmTypes") List<String> alarmTypes,
@Param("alarmSeverities") List<AlarmSeverity> alarmSeverities,
Pageable pageable);
@Param("alarmSeverities") List<String> alarmSeverities,
int limit);
}

7
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java

@ -436,9 +436,10 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
}
@Override
public PageData<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink) {
return DaoUtil.pageToPageData(alarmRepository.findActiveOriginatorAlarms(tenantId.getId(), originatorAlarmFilter.getOriginatorId().getId(),
originatorAlarmFilter.getTypeList(), originatorAlarmFilter.getSeverityList(), toPageable(pageLink, false)));
public List<UUID> findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter filter, int limit) {
return alarmRepository.findActiveOriginatorAlarms(filter.getOriginatorId().getId(),
filter.getTypeList(), filter.getSeverityList() != null ? filter.getSeverityList().stream().map(Enum::name).toList() : null,
limit);
}
private static String getPropagationTypes(AlarmPropagationInfo ap) {

Loading…
Cancel
Save