From fe1d42a9beeafd8bec9d12022154c868d05b815d Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Wed, 8 Jul 2020 11:42:28 +0300 Subject: [PATCH] Alarm Query improvements --- .../server/dao/alarm/BaseAlarmService.java | 1 - .../server/dao/sql/alarm/AlarmRepository.java | 16 ++++++---------- .../server/dao/sql/alarm/JpaAlarmDao.java | 1 - .../sql/query/DefaultAlarmQueryRepository.java | 12 +++++++++--- .../server/dao/SqlDaoServiceTestSuite.java | 2 +- .../server/dao/service/BaseAlarmServiceTest.java | 7 +++++-- 6 files changed, 21 insertions(+), 18 deletions(-) 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 b4691c4683..85241baa51 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 @@ -176,7 +176,6 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } else { propagatedEntitiesList = Collections.singletonList(alarm.getOriginator()); } - createAlarmRelation(alarm.getTenantId(), alarm.getOriginator(), alarm.getId()); return propagatedEntitiesList; } 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 883da98050..176da7b7b3 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 @@ -50,11 +50,10 @@ public interface AlarmRepository extends CrudRepository { @Query(value = "SELECT new org.thingsboard.server.dao.model.sql.AlarmInfoEntity(a) FROM AlarmEntity a, " + "RelationEntity re " + "WHERE a.tenantId = :tenantId " + - "AND a.id = re.toId AND re.toType = 'ALARM' " + - "AND re.relationTypeGroup = 'ALARM' " + - "AND re.relationType = :relationType " + + "AND (a.originatorId = :affectedEntityId or (a.id = re.toId " + + "AND re.relationTypeGroup = 'ALARM' AND re.toType = 'ALARM' " + "AND re.fromId = :affectedEntityId " + - "AND re.fromType = :affectedEntityType " + + "AND re.fromType = :affectedEntityType)) " + "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND (:alarmStatuses IS NULL OR a.status in :alarmStatuses) " + @@ -64,11 +63,10 @@ public interface AlarmRepository extends CrudRepository { countQuery = "SELECT count(a) FROM AlarmEntity a, " + "RelationEntity re " + "WHERE a.tenantId = :tenantId " + - "AND a.id = re.toId AND re.toType = 'ALARM' " + - "AND re.relationTypeGroup = 'ALARM' " + - "AND re.relationType = :relationType " + + "AND (a.originatorId = :affectedEntityId or (a.id = re.toId " + + "AND re.relationTypeGroup = 'ALARM' AND re.toType = 'ALARM' " + "AND re.fromId = :affectedEntityId " + - "AND re.fromType = :affectedEntityType " + + "AND re.fromType = :affectedEntityType)) " + "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND (:alarmStatuses IS NULL OR a.status in :alarmStatuses) " + @@ -78,12 +76,10 @@ public interface AlarmRepository extends CrudRepository { Page findAlarms(@Param("tenantId") UUID tenantId, @Param("affectedEntityId") UUID affectedEntityId, @Param("affectedEntityType") String affectedEntityType, - @Param("relationType") String relationType, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("alarmStatuses") Set alarmStatuses, @Param("searchText") String searchText, Pageable pageable); - } 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 463e439174..a4398e2708 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 @@ -110,7 +110,6 @@ public class JpaAlarmDao extends JpaAbstractDao implements A tenantId.getId(), affectedEntity.getId(), affectedEntity.getEntityType().name(), - AlarmSearchStatus.ANY.name(), query.getPageLink().getStartTime(), query.getPageLink().getEndTime(), statusSet, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java index e1396cf554..4ac0c3be41 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -101,7 +101,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { " a.propagate_relation_types as propagate_relation_types, " + " a.type as type," + SELECT_ORIGINATOR_NAME + ", "; - public static final String JOIN_RELATIONS = "left join relation r on r.relation_type_group = 'ALARM' and r.relation_type = 'ALARM_ANY' and a.id = r.to_id"; + public static final String JOIN_RELATIONS = ", relation r"; @Autowired protected NamedParameterJdbcTemplate jdbcTemplate; @@ -133,7 +133,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { .append(" ").append(sortOrder.getDirection().name()); ctx.addUuidListParameter("entity_ids", orderedEntityIds.stream().map(EntityId::getId).collect(Collectors.toList())); if (pageLink.isSearchPropagatedAlarms()) { - fromPart.append(" and r.from_id in (:entity_ids)"); + wherePart.append(" and (a.originator_id in (:entity_ids) or (r.relation_type_group = 'ALARM' and r.relation_type = 'ALARM_ANY' and a.id = r.to_id and r.from_id in (:entity_ids)))"); } else { addAndIfNeeded(wherePart, addAnd); addAnd = true; @@ -219,6 +219,12 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex); } List> rows = jdbcTemplate.queryForList(dataQuery, ctx); + log.error(dataQuery); + log.error("PARAMS:"); + for (String param : ctx.getParameterNames()) { + log.error("PARAM: {}, VALUE: {}", param, ctx.getValue(param)); + } + return AlarmDataAdapter.createAlarmData(pageLink, rows, totalElements, orderedEntityIds); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java index a6ef3935b0..db87deab93 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java @@ -24,7 +24,7 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClassnameFilters({ - "org.thingsboard.server.dao.service.sql.*SqlTest" + "org.thingsboard.server.dao.service.sql.AlarmServiceSqlTest" }) public class SqlDaoServiceTestSuite { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java index ddb49b4b4e..5c7396fb4f 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java @@ -343,6 +343,9 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { pageLink.setStatusList(Arrays.asList(AlarmSearchStatus.ACTIVE)); alarms = alarmService.findAlarmDataByQueryForEntities(tenantId, new CustomerId(CustomerId.NULL_UUID), pageLink, Collections.singletonList(childId)); + Assert.assertNotNull(alarms.getData()); + Assert.assertEquals(1, alarms.getData().size()); + Assert.assertEquals(created, alarms.getData().get(0)); // Check parent relation pageLink.setPage(0); @@ -435,10 +438,10 @@ public abstract class BaseAlarmServiceTest extends AbstractServiceTest { Assert.assertEquals(created, alarms.getData().get(0)); List toAlarmRelations = relationService.findByTo(tenantId, created.getId(), RelationTypeGroup.ALARM); - Assert.assertEquals(2, toAlarmRelations.size()); + Assert.assertEquals(1, toAlarmRelations.size()); List fromChildRelations = relationService.findByFrom(tenantId, childId, RelationTypeGroup.ALARM); - Assert.assertEquals(1, fromChildRelations.size()); + Assert.assertEquals(0, fromChildRelations.size()); List fromParentRelations = relationService.findByFrom(tenantId, parentId, RelationTypeGroup.ALARM); Assert.assertEquals(1, fromParentRelations.size());