From 9d3bd3b3150fc4fc60d080601975f0e4ad39efcd Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Tue, 23 May 2017 13:53:03 +0300 Subject: [PATCH] Alarm search query implementation --- .../server/common/data/alarm/AlarmQuery.java | 2 + .../server/dao/AbstractSearchTimeDao.java | 40 +++++++++---- .../server/dao/alarm/AlarmDao.java | 3 + .../server/dao/alarm/AlarmDaoImpl.java | 39 +++++++++--- .../server/dao/alarm/AlarmService.java | 5 -- .../server/dao/alarm/BaseAlarmService.java | 43 +++++--------- .../server/dao/relation/BaseRelationDao.java | 59 +++++++++++++------ .../server/dao/relation/RelationDao.java | 3 + dao/src/main/resources/schema.cql | 2 +- .../thingsboard/server/dao/DaoTestSuite.java | 13 ++-- .../server/dao/service/AlarmServiceTest.java | 20 +++++-- 11 files changed, 147 insertions(+), 82 deletions(-) diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmQuery.java b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmQuery.java index 2dc0189ed0..9c4f9218fc 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmQuery.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmQuery.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.common.data.alarm; +import lombok.Builder; import lombok.Data; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; @@ -24,6 +25,7 @@ import org.thingsboard.server.common.data.page.TimePageLink; * Created by ashvayka on 11.05.17. */ @Data +@Builder public class AlarmQuery { private TenantId tenantId; diff --git a/dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.java b/dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.java index 5852e3c7e3..8ccbb887ad 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/AbstractSearchTimeDao.java @@ -47,8 +47,27 @@ public abstract class AbstractSearchTimeDao> extends Abs return findPageWithTimeSearch(searchView, clauses, Collections.singletonList(ordering), pageLink); } - protected List findPageWithTimeSearch(String searchView, List clauses, List topLevelOrderings, TimePageLink pageLink) { + return findPageWithTimeSearch(searchView, clauses, topLevelOrderings, pageLink, ModelConstants.ID_PROPERTY); + } + + protected List findPageWithTimeSearch(String searchView, List clauses, TimePageLink pageLink, String idColumn) { + return findPageWithTimeSearch(searchView, clauses, Collections.emptyList(), pageLink, idColumn); + } + + protected List findPageWithTimeSearch(String searchView, List clauses, List topLevelOrderings, TimePageLink pageLink, String idColumn) { + return findListByStatement(buildQuery(searchView, clauses, topLevelOrderings, pageLink, idColumn)); + } + + public static Where buildQuery(String searchView, List clauses, TimePageLink pageLink, String idColumn) { + return buildQuery(searchView, clauses, Collections.emptyList(), pageLink, idColumn); + } + + public static Where buildQuery(String searchView, List clauses, Ordering order, TimePageLink pageLink, String idColumn) { + return buildQuery(searchView, clauses, Collections.singletonList(order), pageLink, idColumn); + } + + public static Where buildQuery(String searchView, List clauses, List topLevelOrderings, TimePageLink pageLink, String idColumn) { Select select = select().from(searchView); Where query = select.where(); for (Clause clause : clauses) { @@ -57,34 +76,35 @@ public abstract class AbstractSearchTimeDao> extends Abs query.limit(pageLink.getLimit()); if (pageLink.isAscOrder()) { if (pageLink.getIdOffset() != null) { - query.and(QueryBuilder.gt(ModelConstants.ID_PROPERTY, pageLink.getIdOffset())); + query.and(QueryBuilder.gt(idColumn, pageLink.getIdOffset())); } else if (pageLink.getStartTime() != null) { final UUID startOf = UUIDs.startOf(pageLink.getStartTime()); - query.and(QueryBuilder.gte(ModelConstants.ID_PROPERTY, startOf)); + query.and(QueryBuilder.gte(idColumn, startOf)); } if (pageLink.getEndTime() != null) { final UUID endOf = UUIDs.endOf(pageLink.getEndTime()); - query.and(QueryBuilder.lte(ModelConstants.ID_PROPERTY, endOf)); + query.and(QueryBuilder.lte(idColumn, endOf)); } } else { if (pageLink.getIdOffset() != null) { - query.and(QueryBuilder.lt(ModelConstants.ID_PROPERTY, pageLink.getIdOffset())); + query.and(QueryBuilder.lt(idColumn, pageLink.getIdOffset())); } else if (pageLink.getEndTime() != null) { final UUID endOf = UUIDs.endOf(pageLink.getEndTime()); - query.and(QueryBuilder.lte(ModelConstants.ID_PROPERTY, endOf)); + query.and(QueryBuilder.lte(idColumn, endOf)); } if (pageLink.getStartTime() != null) { final UUID startOf = UUIDs.startOf(pageLink.getStartTime()); - query.and(QueryBuilder.gte(ModelConstants.ID_PROPERTY, startOf)); + query.and(QueryBuilder.gte(idColumn, startOf)); } } List orderings = new ArrayList<>(topLevelOrderings); if (pageLink.isAscOrder()) { - orderings.add(QueryBuilder.asc(ModelConstants.ID_PROPERTY)); + orderings.add(QueryBuilder.asc(idColumn)); } else { - orderings.add(QueryBuilder.desc(ModelConstants.ID_PROPERTY)); + orderings.add(QueryBuilder.desc(idColumn)); } query.orderBy(orderings.toArray(new Ordering[orderings.size()])); - return findListByStatement(query); + return query; } + } 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 e5383b6b0f..9fdd92e4cf 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 @@ -17,11 +17,13 @@ package org.thingsboard.server.dao.alarm; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmQuery; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.Dao; import org.thingsboard.server.dao.model.AlarmEntity; +import java.util.List; import java.util.UUID; /** @@ -35,4 +37,5 @@ public interface AlarmDao extends Dao { AlarmEntity save(Alarm alarm); + ListenableFuture> findAlarms(AlarmQuery query); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDaoImpl.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDaoImpl.java index 493f727f48..05678cc0b4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDaoImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDaoImpl.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * 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, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,24 +15,27 @@ */ package org.thingsboard.server.dao.alarm; -import com.datastax.driver.core.querybuilder.Ordering; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.datastax.driver.core.querybuilder.Select; -import com.google.common.base.Function; +import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmQuery; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.dao.AbstractModelDao; +import org.thingsboard.server.dao.AbstractSearchTimeDao; import org.thingsboard.server.dao.model.AlarmEntity; -import org.thingsboard.server.dao.model.BaseEntity; import org.thingsboard.server.dao.model.ModelConstants; +import org.thingsboard.server.dao.relation.RelationDao; -import javax.annotation.Nullable; -import java.util.Optional; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; @@ -43,6 +46,9 @@ import static org.thingsboard.server.dao.model.ModelConstants.*; @Slf4j public class AlarmDaoImpl extends AbstractModelDao implements AlarmDao { + @Autowired + private RelationDao relationDao; + @Override protected Class getColumnFamilyClass() { return AlarmEntity.class; @@ -80,4 +86,19 @@ public class AlarmDaoImpl extends AbstractModelDao implements Alarm log.trace("Execute query {}", query); return Futures.transform(findOneByStatementAsync(query), toDataFunction()); } + + @Override + public ListenableFuture> findAlarms(AlarmQuery query) { + log.trace("Try to find alarms by entity [{}], status [{}] and pageLink [{}]", query.getAffectedEntityId(), query.getStatus(), query.getPageLink()); + EntityId affectedEntity = query.getAffectedEntityId(); + String relationType = query.getStatus() == null ? BaseAlarmService.ALARM_RELATION : BaseAlarmService.ALARM_RELATION_PREFIX + query.getStatus().name(); + ListenableFuture> relations = relationDao.findRelations(affectedEntity, relationType, query.getPageLink()); + return Futures.transform(relations, (AsyncFunction, List>) input -> { + List> alarmFutures = new ArrayList<>(input.size()); + for (EntityRelation relation : input) { + alarmFutures.add(findAlarmByIdAsync(relation.getTo().getId())); + } + return Futures.successfulAsList(alarmFutures); + }); + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java index 6508db21a1..3d35723afb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java @@ -16,16 +16,11 @@ package org.thingsboard.server.dao.alarm; import com.google.common.util.concurrent.ListenableFuture; -import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmId; import org.thingsboard.server.common.data.alarm.AlarmQuery; -import org.thingsboard.server.common.data.id.DeviceId; -import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.page.TimePageData; -import java.util.Optional; - /** * Created by ashvayka on 11.05.17. */ 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 adb4740f60..d274ea930c 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 @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * 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, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,63 +17,43 @@ package org.thingsboard.server.dao.alarm; import com.google.common.base.Function; -import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmId; import org.thingsboard.server.common.data.alarm.AlarmQuery; import org.thingsboard.server.common.data.alarm.AlarmStatus; -import org.thingsboard.server.common.data.asset.Asset; -import org.thingsboard.server.common.data.id.AssetId; -import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; -import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.common.data.page.TextPageData; -import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TimePageData; import org.thingsboard.server.common.data.relation.EntityRelation; -import org.thingsboard.server.dao.asset.AssetDao; -import org.thingsboard.server.dao.asset.AssetSearchQuery; -import org.thingsboard.server.dao.asset.AssetService; -import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.entity.BaseEntityService; import org.thingsboard.server.dao.exception.DataValidationException; -import org.thingsboard.server.dao.model.AlarmEntity; -import org.thingsboard.server.dao.model.AssetEntity; -import org.thingsboard.server.dao.model.CustomerEntity; -import org.thingsboard.server.dao.model.TenantEntity; +import org.thingsboard.server.dao.model.*; import org.thingsboard.server.dao.relation.EntityRelationsQuery; import org.thingsboard.server.dao.relation.EntitySearchDirection; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.relation.RelationsSearchParameters; import org.thingsboard.server.dao.service.DataValidator; -import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.tenant.TenantDao; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import static org.thingsboard.server.dao.DaoUtil.*; -import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; import static org.thingsboard.server.dao.service.Validator.*; @Service @Slf4j public class BaseAlarmService extends BaseEntityService implements AlarmService { - private static final String ALARM_RELATION_PREFIX = "ALARM_"; - private static final String ALARM_RELATION = "ALARM_ANY"; + public static final String ALARM_RELATION_PREFIX = "ALARM_"; + public static final String ALARM_RELATION = "ALARM_ANY"; @Autowired private AlarmDao alarmDao; @@ -190,7 +170,14 @@ public class BaseAlarmService extends BaseEntityService implements AlarmService @Override public ListenableFuture> findAlarms(AlarmQuery query) { - return null; + ListenableFuture> alarms = alarmDao.findAlarms(query); + return Futures.transform(alarms, new Function, TimePageData>() { + @Nullable + @Override + public TimePageData apply(@Nullable List alarms) { + return new TimePageData<>(alarms, query.getPageLink()); + } + }); } private void deleteRelation(EntityRelation alarmRelation) throws ExecutionException, InterruptedException { diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java index 5fd663212c..b179a1ede4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationDao.java @@ -16,6 +16,8 @@ package org.thingsboard.server.dao.relation; import com.datastax.driver.core.*; +import com.datastax.driver.core.querybuilder.QueryBuilder; +import com.datastax.driver.core.querybuilder.Select; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; @@ -24,15 +26,21 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityIdFactory; +import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.dao.AbstractAsyncDao; +import org.thingsboard.server.dao.AbstractSearchTimeDao; import org.thingsboard.server.dao.model.ModelConstants; import javax.annotation.Nullable; import javax.annotation.PostConstruct; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; +import static org.thingsboard.server.dao.model.ModelConstants.RELATION_COLUMN_FAMILY_NAME; + /** * Created by ashvayka on 25.04.17. */ @@ -145,6 +153,17 @@ public class BaseRelationDao extends AbstractAsyncDao implements RelationDao { return getBooleanListenableFuture(future); } + @Override + public ListenableFuture> findRelations(EntityId from, String relationType, TimePageLink pageLink) { + Select.Where query = AbstractSearchTimeDao.buildQuery(RELATION_COLUMN_FAMILY_NAME, + Arrays.asList(eq(ModelConstants.RELATION_FROM_ID_PROPERTY, from.getId()), + eq(ModelConstants.RELATION_FROM_TYPE_PROPERTY, from.getEntityType().name()), + eq(ModelConstants.RELATION_TYPE_PROPERTY, relationType)), + QueryBuilder.asc(ModelConstants.RELATION_TYPE_PROPERTY), + pageLink, ModelConstants.RELATION_TO_ID_PROPERTY); + return getFuture(executeAsyncRead(query), rs -> getEntityRelations(rs)); + } + private PreparedStatement getSaveStmt() { if (saveStmt == null) { saveStmt = getSession().prepare("INSERT INTO " + ModelConstants.RELATION_COLUMN_FAMILY_NAME + " " + @@ -235,31 +254,13 @@ public class BaseRelationDao extends AbstractAsyncDao implements RelationDao { return checkRelationStmt; } - private EntityRelation getEntityRelation(Row row) { - EntityRelation relation = new EntityRelation(); - relation.setType(row.getString(ModelConstants.RELATION_TYPE_PROPERTY)); - relation.setAdditionalInfo(row.get(ModelConstants.ADDITIONAL_INFO_PROPERTY, JsonNode.class)); - relation.setFrom(toEntity(row, ModelConstants.RELATION_FROM_ID_PROPERTY, ModelConstants.RELATION_FROM_TYPE_PROPERTY)); - relation.setTo(toEntity(row, ModelConstants.RELATION_TO_ID_PROPERTY, ModelConstants.RELATION_TO_TYPE_PROPERTY)); - return relation; - } - private EntityId toEntity(Row row, String uuidColumn, String typeColumn) { return EntityIdFactory.getByTypeAndUuid(row.getString(typeColumn), row.getUUID(uuidColumn)); } private ListenableFuture> executeAsyncRead(EntityId from, BoundStatement stmt) { log.debug("Generated query [{}] for entity {}", stmt, from); - return getFuture(executeAsyncRead(stmt), rs -> { - List rows = rs.all(); - List entries = new ArrayList<>(rows.size()); - if (!rows.isEmpty()) { - rows.forEach(row -> { - entries.add(getEntityRelation(row)); - }); - } - return entries; - }); + return getFuture(executeAsyncRead(stmt), rs -> getEntityRelations(rs)); } private ListenableFuture getBooleanListenableFuture(ResultSetFuture rsFuture) { @@ -276,4 +277,24 @@ public class BaseRelationDao extends AbstractAsyncDao implements RelationDao { }, readResultsProcessingExecutor); } + private List getEntityRelations(ResultSet rs) { + List rows = rs.all(); + List entries = new ArrayList<>(rows.size()); + if (!rows.isEmpty()) { + rows.forEach(row -> { + entries.add(getEntityRelation(row)); + }); + } + return entries; + } + + private EntityRelation getEntityRelation(Row row) { + EntityRelation relation = new EntityRelation(); + relation.setType(row.getString(ModelConstants.RELATION_TYPE_PROPERTY)); + relation.setAdditionalInfo(row.get(ModelConstants.ADDITIONAL_INFO_PROPERTY, JsonNode.class)); + relation.setFrom(toEntity(row, ModelConstants.RELATION_FROM_ID_PROPERTY, ModelConstants.RELATION_FROM_TYPE_PROPERTY)); + relation.setTo(toEntity(row, ModelConstants.RELATION_TO_ID_PROPERTY, ModelConstants.RELATION_TO_TYPE_PROPERTY)); + return relation; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java index df47259371..1a4838a5c4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/relation/RelationDao.java @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.relation; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import java.util.List; @@ -44,4 +45,6 @@ public interface RelationDao { ListenableFuture deleteOutboundRelations(EntityId entity); + ListenableFuture> findRelations(EntityId from, String relationType, TimePageLink pageLink); + } diff --git a/dao/src/main/resources/schema.cql b/dao/src/main/resources/schema.cql index b86031b76e..efaa987f5e 100644 --- a/dao/src/main/resources/schema.cql +++ b/dao/src/main/resources/schema.cql @@ -268,7 +268,7 @@ CREATE TABLE IF NOT EXISTS thingsboard.relation ( relation_type text, additional_info text, PRIMARY KEY ((from_id, from_type), relation_type, to_id, to_type) -); +) WITH CLUSTERING ORDER BY ( relation_type ASC, to_id ASC, to_type ASC); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.reverse_relation AS SELECT * diff --git a/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java index b1502595cb..277e638105 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/DaoTestSuite.java @@ -25,12 +25,13 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClassnameFilters({ - "org.thingsboard.server.dao.service.*Test", - "org.thingsboard.server.dao.kv.*Test", - "org.thingsboard.server.dao.plugin.*Test", - "org.thingsboard.server.dao.rule.*Test", - "org.thingsboard.server.dao.attributes.*Test", - "org.thingsboard.server.dao.timeseries.*Test" + "org.thingsboard.server.dao.service.AlarmServiceTest" +// "org.thingsboard.server.dao.service.*Test", +// "org.thingsboard.server.dao.kv.*Test", +// "org.thingsboard.server.dao.plugin.*Test", +// "org.thingsboard.server.dao.rule.*Test", +// "org.thingsboard.server.dao.attributes.*Test", +// "org.thingsboard.server.dao.timeseries.*Test" }) public class DaoTestSuite { diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java index 8b905218a4..d68360a29b 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AlarmServiceTest.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); * 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, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,11 +23,14 @@ import org.junit.Test; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmQuery; import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.TimePageData; +import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.relation.EntityRelationsQuery; @@ -94,5 +97,14 @@ public class AlarmServiceTest extends AbstractServiceTest { Alarm fetched = alarmService.findAlarmById(created.getId()).get(); Assert.assertEquals(created, fetched); + + TimePageData alarms = alarmService.findAlarms(AlarmQuery.builder().tenantId(tenantId) + .affectedEntityId(parentId) + .status(AlarmStatus.ACTIVE_UNACK).pageLink( + new TimePageLink(1, 0L, Long.MAX_VALUE, true) + ).build()).get(); + Assert.assertNotNull(alarms.getData()); + Assert.assertEquals(1, alarms.getData().size()); + Assert.assertEquals(created, alarms.getData().get(0)); } }