Browse Source

Alarm assignment improvements

pull/8096/head
Andrii Shvaika 4 years ago
parent
commit
3932993b58
  1. 2
      application/src/main/data/upgrade/3.4.4/schema_update.sql
  2. 1
      common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java
  3. 2
      common/data/src/main/java/org/thingsboard/server/common/data/HasEmail.java
  4. 2
      common/data/src/main/java/org/thingsboard/server/common/data/HasLabel.java
  5. 2
      common/data/src/main/java/org/thingsboard/server/common/data/HasTitle.java
  6. 4
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/Alarm.java
  7. 27
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmInfo.java
  8. 2
      dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
  9. 84
      dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java
  10. 2
      dao/src/main/resources/sql/schema-entities-idx.sql

2
application/src/main/data/upgrade/3.4.4/schema_update.sql

@ -20,6 +20,8 @@
ALTER TABLE alarm ADD COLUMN IF NOT EXISTS assign_ts BIGINT; ALTER TABLE alarm ADD COLUMN IF NOT EXISTS assign_ts BIGINT;
ALTER TABLE alarm ADD COLUMN IF NOT EXISTS assignee_id UUID; ALTER TABLE alarm ADD COLUMN IF NOT EXISTS assignee_id UUID;
CREATE INDEX IF NOT EXISTS idx_alarm_tenant_assignee_created_time ON alarm(tenant_id, assignee_id, created_time DESC);
-- ALARM ASSIGN TO USER END -- ALARM ASSIGN TO USER END
CREATE TABLE IF NOT EXISTS alarm_comment ( CREATE TABLE IF NOT EXISTS alarm_comment (

1
common/dao-api/src/main/java/org/thingsboard/server/dao/entity/EntityService.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.dao.entity; package org.thingsboard.server.dao.entity;
import org.springframework.data.util.Pair;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;

2
common/data/src/main/java/org/thingsboard/server/common/data/HasEmail.java

@ -1,5 +1,5 @@
/** /**
* Copyright © 2016-2022 The Thingsboard Authors * Copyright © 2016-2023 The Thingsboard Authors
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

2
common/data/src/main/java/org/thingsboard/server/common/data/HasLabel.java

@ -1,5 +1,5 @@
/** /**
* Copyright © 2016-2022 The Thingsboard Authors * Copyright © 2016-2023 The Thingsboard Authors
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

2
common/data/src/main/java/org/thingsboard/server/common/data/HasTitle.java

@ -1,5 +1,5 @@
/** /**
* Copyright © 2016-2022 The Thingsboard Authors * Copyright © 2016-2023 The Thingsboard Authors
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.

4
common/data/src/main/java/org/thingsboard/server/common/data/alarm/Alarm.java

@ -22,6 +22,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.BaseData; import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.common.data.HasCustomerId; import org.thingsboard.server.common.data.HasCustomerId;
import org.thingsboard.server.common.data.HasName; import org.thingsboard.server.common.data.HasName;
@ -41,6 +42,7 @@ import java.util.List;
*/ */
@ApiModel @ApiModel
@Data @Data
@EqualsAndHashCode(callSuper = true)
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
public class Alarm extends BaseData<AlarmId> implements HasName, HasTenantId, HasCustomerId { public class Alarm extends BaseData<AlarmId> implements HasName, HasTenantId, HasCustomerId {
@ -71,7 +73,7 @@ public class Alarm extends BaseData<AlarmId> implements HasName, HasTenantId, Ha
private long ackTs; private long ackTs;
@ApiModelProperty(position = 14, value = "Timestamp of the alarm clearing, in milliseconds", example = "1634114528465") @ApiModelProperty(position = 14, value = "Timestamp of the alarm clearing, in milliseconds", example = "1634114528465")
private long clearTs; private long clearTs;
@ApiModelProperty(position = 15, value = "Timestamp of the alarm assigning0, in milliseconds", example = "1634115928465") @ApiModelProperty(position = 15, value = "Timestamp of the alarm assignment, in milliseconds", example = "1634115928465")
private long assignTs; private long assignTs;
@ApiModelProperty(position = 16, value = "JSON object with alarm details") @ApiModelProperty(position = 16, value = "JSON object with alarm details")
private transient JsonNode details; private transient JsonNode details;

27
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmInfo.java

@ -17,12 +17,14 @@ package org.thingsboard.server.common.data.alarm;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import java.util.Objects; import java.util.Objects;
@EqualsAndHashCode(callSuper = true)
@ApiModel @ApiModel
public class AlarmInfo extends Alarm { public class AlarmInfo extends Alarm {
@ -79,29 +81,4 @@ public class AlarmInfo extends Alarm {
this.assigneeEmail = assigneeEmail; this.assigneeEmail = assigneeEmail;
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
AlarmInfo alarmInfo = (AlarmInfo) o;
return (Objects.equals(originatorName, alarmInfo.originatorName)) &&
(Objects.equals(originatorLabel, alarmInfo.originatorLabel)) &&
(Objects.equals(assigneeFirstName, alarmInfo.assigneeFirstName)) &&
(Objects.equals(assigneeLastName, alarmInfo.assigneeLastName)) &&
(Objects.equals(assigneeEmail, alarmInfo.assigneeEmail));
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (originatorName != null ? originatorName.hashCode() : 0)
+ (originatorLabel != null ? originatorLabel.hashCode() : 0)
+ (assigneeFirstName != null ? assigneeFirstName.hashCode() : 0)
+ (assigneeLastName != null ? assigneeLastName.hashCode() : 0)
+ (assigneeEmail != null ? assigneeEmail.hashCode() : 0);
return result;
}
} }

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

@ -122,7 +122,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
if (alarm.getEndTs() == 0L) { if (alarm.getEndTs() == 0L) {
alarm.setEndTs(alarm.getStartTs()); alarm.setEndTs(alarm.getStartTs());
} }
alarm.setCustomerId(entityService.fetchEntityCustomerId(alarm.getTenantId(), alarm.getOriginator()).orElse(null)); alarm.setCustomerId(entityService.fetchEntityCustomerId(alarm.getTenantId(), alarm.getOriginator()).get());
if (alarm.getId() == null) { if (alarm.getId() == null) {
Alarm existing = alarmDao.findLatestByOriginatorAndType(alarm.getTenantId(), alarm.getOriginator(), alarm.getType()); Alarm existing = alarmDao.findLatestByOriginatorAndType(alarm.getTenantId(), alarm.getOriginator(), alarm.getType());
if (existing == null || existing.getStatus().isCleared()) { if (existing == null || existing.getStatus().isCleared()) {

84
dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java

@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * 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 * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -16,7 +16,9 @@
package org.thingsboard.server.dao.entity; package org.thingsboard.server.dao.entity;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.thingsboard.server.common.data.HasCustomerId; import org.thingsboard.server.common.data.HasCustomerId;
@ -37,6 +39,7 @@ import org.thingsboard.server.common.data.query.RelationsQueryFilter;
import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.exception.IncorrectParameterException;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function;
import static org.thingsboard.server.common.data.id.EntityId.NULL_UUID; import static org.thingsboard.server.common.data.id.EntityId.NULL_UUID;
import static org.thingsboard.server.dao.service.Validator.validateEntityDataPageLink; import static org.thingsboard.server.dao.service.Validator.validateEntityDataPageLink;
@ -80,59 +83,58 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe
@Override @Override
public Optional<String> fetchEntityName(TenantId tenantId, EntityId entityId) { public Optional<String> fetchEntityName(TenantId tenantId, EntityId entityId) {
log.trace("Executing fetchEntityName [{}]", entityId); log.trace("Executing fetchEntityName [{}]", entityId);
EntityDaoService entityDaoService = entityServiceRegistry.getServiceByEntityType(entityId.getEntityType()); return fetchAndConvert(tenantId, entityId, this::getName);
Optional<HasId<?>> hasIdOpt = entityDaoService.findEntity(tenantId, entityId);
if (hasIdOpt.isPresent()) {
HasId<?> hasId = hasIdOpt.get();
if (hasId instanceof HasName) {
HasName hasName = (HasName) hasId;
return Optional.ofNullable(hasName.getName());
}
}
return Optional.empty();
} }
@Override @Override
public Optional<String> fetchEntityLabel(TenantId tenantId, EntityId entityId) { public Optional<String> fetchEntityLabel(TenantId tenantId, EntityId entityId) {
log.trace("Executing fetchEntityLabel [{}]", entityId); log.trace("Executing fetchEntityLabel [{}]", entityId);
EntityDaoService entityDaoService = entityServiceRegistry.getServiceByEntityType(entityId.getEntityType()); return fetchAndConvert(tenantId, entityId, this::getLabel);
Optional<HasId<?>> entityOpt = entityDaoService.findEntity(tenantId, entityId);
String entityLabel = null;
if (entityOpt.isPresent()) {
HasId<?> entity = entityOpt.get();
if (entity instanceof HasTitle) {
entityLabel = ((HasTitle) entity).getTitle();
}
if (entity instanceof HasLabel && entityLabel == null) {
entityLabel = ((HasLabel) entity).getLabel();
}
if (entity instanceof HasEmail && entityLabel == null) {
entityLabel = ((HasEmail) entity).getEmail();
}
if (entity instanceof HasName && entityLabel == null) {
entityLabel = ((HasName) entity).getName();
}
}
return Optional.ofNullable(entityLabel);
} }
@Override @Override
public Optional<CustomerId> fetchEntityCustomerId(TenantId tenantId, EntityId entityId) { public Optional<CustomerId> fetchEntityCustomerId(TenantId tenantId, EntityId entityId) {
log.trace("Executing fetchEntityCustomerId [{}]", entityId); log.trace("Executing fetchEntityCustomerId [{}]", entityId);
return fetchAndConvert(tenantId, entityId, this::getCustomerId);
}
private <T> Optional<T> fetchAndConvert(TenantId tenantId, EntityId entityId, Function<HasId<?>, T> converter) {
EntityDaoService entityDaoService = entityServiceRegistry.getServiceByEntityType(entityId.getEntityType()); EntityDaoService entityDaoService = entityServiceRegistry.getServiceByEntityType(entityId.getEntityType());
Optional<HasId<?>> hasIdOpt = entityDaoService.findEntity(tenantId, entityId); Optional<HasId<?>> entityOpt = entityDaoService.findEntity(tenantId, entityId);
if (hasIdOpt.isPresent()) { return entityOpt.map(converter);
HasId<?> hasId = hasIdOpt.get(); }
if (hasId instanceof HasCustomerId) {
HasCustomerId hasCustomerId = (HasCustomerId) hasId; private String getName(HasId<?> entity) {
CustomerId customerId = hasCustomerId.getCustomerId(); return entity instanceof HasName ? ((HasName) entity).getName() : null;
if (customerId == null) { }
customerId = NULL_CUSTOMER_ID;
} private String getLabel(HasId<?> entity) {
return Optional.of(customerId); String entityLabel = null;
if (entity instanceof HasTitle) {
entityLabel = ((HasTitle) entity).getTitle();
}
if (entity instanceof HasLabel && entityLabel == null) {
entityLabel = ((HasLabel) entity).getLabel();
}
if (entity instanceof HasEmail && entityLabel == null) {
entityLabel = ((HasEmail) entity).getEmail();
}
if (entity instanceof HasName && entityLabel == null) {
entityLabel = ((HasName) entity).getName();
}
return entityLabel;
}
private CustomerId getCustomerId(HasId<?> hasId) {
if (hasId instanceof HasCustomerId) {
HasCustomerId hasCustomerId = (HasCustomerId) hasId;
CustomerId customerId = hasCustomerId.getCustomerId();
if (customerId == null) {
customerId = NULL_CUSTOMER_ID;
} }
return customerId;
} }
return Optional.of(NULL_CUSTOMER_ID); return NULL_CUSTOMER_ID;
} }
private static void validateEntityCountQuery(EntityCountQuery query) { private static void validateEntityCountQuery(EntityCountQuery query) {

2
dao/src/main/resources/sql/schema-entities-idx.sql

@ -24,6 +24,8 @@ CREATE INDEX IF NOT EXISTS idx_alarm_tenant_status_created_time ON alarm(tenant_
CREATE INDEX IF NOT EXISTS idx_alarm_tenant_alarm_type_created_time ON alarm(tenant_id, type, created_time DESC); CREATE INDEX IF NOT EXISTS idx_alarm_tenant_alarm_type_created_time ON alarm(tenant_id, type, created_time DESC);
CREATE INDEX IF NOT EXISTS idx_alarm_tenant_assignee_created_time ON alarm(tenant_id, assignee_id, created_time DESC);
CREATE INDEX IF NOT EXISTS idx_entity_alarm_created_time ON entity_alarm(tenant_id, entity_id, created_time DESC); CREATE INDEX IF NOT EXISTS idx_entity_alarm_created_time ON entity_alarm(tenant_id, entity_id, created_time DESC);
CREATE INDEX IF NOT EXISTS idx_entity_alarm_alarm_id ON entity_alarm(alarm_id); CREATE INDEX IF NOT EXISTS idx_entity_alarm_alarm_id ON entity_alarm(alarm_id);

Loading…
Cancel
Save