From ec7e615559d22f740e68fe6434f93211c3062d80 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Fri, 15 Nov 2024 12:56:01 +0200 Subject: [PATCH] improved sql-query, improved variable naming --- ...efaultTbEntityDataSubscriptionService.java | 32 +++++----- .../TbAlarmStatusSubscription.java | 20 +++--- .../telemetry/cmd/v2/AlarmStatusUpdate.java | 10 +-- .../server/controller/WebsocketApiTest.java | 33 +++++----- .../server/dao/alarm/AlarmService.java | 2 +- .../server/dao/alarm/AlarmDao.java | 2 +- .../server/dao/alarm/BaseAlarmService.java | 4 +- .../server/dao/sql/alarm/AlarmRepository.java | 63 ++++++++++--------- .../server/dao/sql/alarm/JpaAlarmDao.java | 7 ++- 9 files changed, 87 insertions(+), 86 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java index cf471db8ee..d1057190e2 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java +++ b/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 alarmIds = alarmService.findActiveOriginatorAlarms(subscription.getTenantId(), originatorAlarmFilter, new PageLink(alarmsPerAlarmStatusSubscriptionCacheSize)).getData(); + List 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 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 sessionSubs = subscriptionsBySessionId.computeIfAbsent(sessionRef.getSessionId(), k -> new ConcurrentHashMap<>()); TbAlarmCountSubCtx ctx = new TbAlarmCountSubCtx(serviceId, wsService, entityService, localSubscriptionService, attributesService, stats, alarmService, sessionRef, cmd.getCmdId()); diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAlarmStatusSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAlarmStatusSubscription.java index 6b16383378..6d0512d633 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAlarmStatusSubscription.java +++ b/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 alarmIds = new HashSet<>(); @Getter @Setter - private boolean exceededLimit; + private boolean fullCache; @Getter private final List typeList; @Getter @@ -52,20 +53,15 @@ public class TbAlarmStatusSubscription extends TbSubscription 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())); + } } diff --git a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/cmd/v2/AlarmStatusUpdate.java b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/cmd/v2/AlarmStatusUpdate.java index daf7af74a3..3cccf2793b 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/cmd/v2/AlarmStatusUpdate.java +++ b/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 diff --git a/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java b/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java index 2b988d0058..10079be341 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java +++ b/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 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 diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java index e3499ee97a..ce040595cc 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java @@ -120,6 +120,6 @@ public interface AlarmService extends EntityDaoService { PageData findAlarmTypesByTenantId(TenantId tenantId, PageLink pageLink); - PageData findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink); + List findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, int limit); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java index 59b882604a..4b4ee0ae4f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java @@ -112,6 +112,6 @@ public interface AlarmDao extends Dao { boolean removeAlarmTypesIfNoAlarmsPresent(UUID tenantId, Set types); - PageData findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink); + List findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, int limit); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 7026de2409..bf08621d14 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -367,9 +367,9 @@ public class BaseAlarmService extends AbstractCachedEntityService findActiveOriginatorAlarms(TenantId tenantId, OriginatorAlarmFilter originatorAlarmFilter, PageLink pageLink) { + public List 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) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java index 1382deb84b..417a810e25 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java @@ -101,8 +101,10 @@ public interface AlarmRepository extends JpaRepository { "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 { "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 { "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 { "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 { "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 { "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 { @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 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 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 findActiveOriginatorAlarms(@Param("originatorId") UUID originatorId, @Param("alarmTypes") List alarmTypes, - @Param("alarmSeverities") List alarmSeverities, - Pageable pageable); + @Param("alarmSeverities") List alarmSeverities, + int limit); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java index dbf7fde100..e433dfbd86 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java @@ -436,9 +436,10 @@ public class JpaAlarmDao extends JpaAbstractDao implements A } @Override - public PageData 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 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) {