Search in sources :

Example 6 with AlarmStatus

use of org.thingsboard.server.common.data.alarm.AlarmStatus in project thingsboard by thingsboard.

the class DefaultAlarmQueryRepository method findAlarmDataByQueryForEntities.

@Override
public PageData<AlarmData> findAlarmDataByQueryForEntities(TenantId tenantId, AlarmDataQuery query, Collection<EntityId> orderedEntityIds) {
    return transactionTemplate.execute(status -> {
        AlarmDataPageLink pageLink = query.getPageLink();
        QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, null, EntityType.ALARM));
        ctx.addUuidListParameter("entity_ids", orderedEntityIds.stream().map(EntityId::getId).collect(Collectors.toList()));
        StringBuilder selectPart = new StringBuilder(FIELDS_SELECTION);
        StringBuilder fromPart = new StringBuilder(" from alarm a ");
        StringBuilder wherePart = new StringBuilder(" where ");
        StringBuilder sortPart = new StringBuilder(" order by ");
        StringBuilder joinPart = new StringBuilder();
        boolean addAnd = false;
        if (pageLink.isSearchPropagatedAlarms()) {
            selectPart.append(" ea.entity_id as entity_id ");
            fromPart.append(JOIN_ENTITY_ALARMS);
            wherePart.append(buildPermissionsQuery(tenantId, ctx));
            addAnd = true;
        } else {
            selectPart.append(" a.originator_id as entity_id ");
        }
        EntityDataSortOrder sortOrder = pageLink.getSortOrder();
        if (sortOrder != null && sortOrder.getKey().getType().equals(EntityKeyType.ALARM_FIELD)) {
            String sortOrderKey = sortOrder.getKey().getKey();
            sortPart.append(alarmFieldColumnMap.getOrDefault(sortOrderKey, sortOrderKey)).append(" ").append(sortOrder.getDirection().name());
            if (pageLink.isSearchPropagatedAlarms()) {
                wherePart.append(" and ea.entity_id in (:entity_ids)");
            } else {
                addAndIfNeeded(wherePart, addAnd);
                addAnd = true;
                wherePart.append(" a.originator_id in (:entity_ids)");
            }
        } else {
            joinPart.append(" inner join (select * from (VALUES");
            int entityIdIdx = 0;
            int lastEntityIdIdx = orderedEntityIds.size() - 1;
            for (EntityId entityId : orderedEntityIds) {
                joinPart.append("(uuid('").append(entityId.getId().toString()).append("'), ").append(entityIdIdx).append(")");
                if (entityIdIdx != lastEntityIdIdx) {
                    joinPart.append(",");
                } else {
                    joinPart.append(")");
                }
                entityIdIdx++;
            }
            joinPart.append(" as e(id, priority)) e ");
            if (pageLink.isSearchPropagatedAlarms()) {
                joinPart.append("on ea.entity_id = e.id");
            } else {
                joinPart.append("on a.originator_id = e.id");
            }
            sortPart.append("e.priority");
        }
        long startTs;
        long endTs;
        if (pageLink.getTimeWindow() > 0) {
            endTs = System.currentTimeMillis();
            startTs = endTs - pageLink.getTimeWindow();
        } else {
            startTs = pageLink.getStartTs();
            endTs = pageLink.getEndTs();
        }
        if (startTs > 0) {
            addAndIfNeeded(wherePart, addAnd);
            addAnd = true;
            ctx.addLongParameter("startTime", startTs);
            wherePart.append("a.created_time >= :startTime");
            if (pageLink.isSearchPropagatedAlarms()) {
                wherePart.append(" and ea.created_time >= :startTime");
            }
        }
        if (endTs > 0) {
            addAndIfNeeded(wherePart, addAnd);
            addAnd = true;
            ctx.addLongParameter("endTime", endTs);
            wherePart.append("a.created_time <= :endTime");
            if (pageLink.isSearchPropagatedAlarms()) {
                wherePart.append(" and ea.created_time <= :endTime");
            }
        }
        if (pageLink.getTypeList() != null && !pageLink.getTypeList().isEmpty()) {
            addAndIfNeeded(wherePart, addAnd);
            addAnd = true;
            ctx.addStringListParameter("alarmTypes", pageLink.getTypeList());
            wherePart.append("a.type in (:alarmTypes)");
            if (pageLink.isSearchPropagatedAlarms()) {
                wherePart.append(" and ea.alarm_type in (:alarmTypes)");
            }
        }
        if (pageLink.getSeverityList() != null && !pageLink.getSeverityList().isEmpty()) {
            addAndIfNeeded(wherePart, addAnd);
            addAnd = true;
            ctx.addStringListParameter("alarmSeverities", pageLink.getSeverityList().stream().map(AlarmSeverity::name).collect(Collectors.toList()));
            wherePart.append("a.severity in (:alarmSeverities)");
        }
        if (pageLink.getStatusList() != null && !pageLink.getStatusList().isEmpty()) {
            Set<AlarmStatus> statusSet = toStatusSet(pageLink.getStatusList());
            if (!statusSet.isEmpty()) {
                addAndIfNeeded(wherePart, addAnd);
                addAnd = true;
                ctx.addStringListParameter("alarmStatuses", statusSet.stream().map(AlarmStatus::name).collect(Collectors.toList()));
                wherePart.append(" a.status in (:alarmStatuses)");
            }
        }
        String textSearchQuery = buildTextSearchQuery(ctx, query.getAlarmFields(), pageLink.getTextSearch());
        String mainQuery;
        if (!textSearchQuery.isEmpty()) {
            mainQuery = selectPart.toString() + fromPart.toString() + wherePart.toString();
            mainQuery = String.format("select * from (%s) a %s WHERE %s", mainQuery, joinPart, textSearchQuery);
        } else {
            mainQuery = selectPart.toString() + fromPart.toString() + joinPart.toString() + wherePart.toString();
        }
        String countQuery = String.format("select count(*) from (%s) result", mainQuery);
        long queryTs = System.currentTimeMillis();
        int totalElements;
        try {
            totalElements = jdbcTemplate.queryForObject(countQuery, ctx, Integer.class);
        } finally {
            queryLog.logQuery(ctx, countQuery, System.currentTimeMillis() - queryTs);
        }
        if (totalElements == 0) {
            return AlarmDataAdapter.createAlarmData(pageLink, Collections.emptyList(), totalElements, orderedEntityIds);
        }
        String dataQuery = mainQuery + sortPart;
        int startIndex = pageLink.getPageSize() * pageLink.getPage();
        if (pageLink.getPageSize() > 0) {
            dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex);
        }
        queryTs = System.currentTimeMillis();
        List<Map<String, Object>> rows;
        try {
            rows = jdbcTemplate.queryForList(dataQuery, ctx);
        } finally {
            queryLog.logQuery(ctx, dataQuery, System.currentTimeMillis() - queryTs);
        }
        return AlarmDataAdapter.createAlarmData(pageLink, rows, totalElements, orderedEntityIds);
    });
}
Also used : AlarmSeverity(org.thingsboard.server.common.data.alarm.AlarmSeverity) EntityId(org.thingsboard.server.common.data.id.EntityId) EntityDataSortOrder(org.thingsboard.server.common.data.query.EntityDataSortOrder) AlarmStatus(org.thingsboard.server.common.data.alarm.AlarmStatus) AlarmDataPageLink(org.thingsboard.server.common.data.query.AlarmDataPageLink) HashMap(java.util.HashMap) Map(java.util.Map)

Example 7 with AlarmStatus

use of org.thingsboard.server.common.data.alarm.AlarmStatus in project thingsboard by thingsboard.

the class DefaultAlarmQueryRepository method toStatusSet.

private Set<AlarmStatus> toStatusSet(List<AlarmSearchStatus> statusList) {
    Set<AlarmStatus> result = new HashSet<>();
    for (AlarmSearchStatus searchStatus : statusList) {
        switch(searchStatus) {
            case ACK:
                result.add(AlarmStatus.ACTIVE_ACK);
                result.add(AlarmStatus.CLEARED_ACK);
                break;
            case UNACK:
                result.add(AlarmStatus.ACTIVE_UNACK);
                result.add(AlarmStatus.CLEARED_UNACK);
                break;
            case CLEARED:
                result.add(AlarmStatus.CLEARED_ACK);
                result.add(AlarmStatus.CLEARED_UNACK);
                break;
            case ACTIVE:
                result.add(AlarmStatus.ACTIVE_ACK);
                result.add(AlarmStatus.ACTIVE_UNACK);
                break;
            default:
                break;
        }
        if (searchStatus == AlarmSearchStatus.ANY || result.size() == AlarmStatus.values().length) {
            result.clear();
            return result;
        }
    }
    return result;
}
Also used : AlarmSearchStatus(org.thingsboard.server.common.data.alarm.AlarmSearchStatus) AlarmStatus(org.thingsboard.server.common.data.alarm.AlarmStatus) HashSet(java.util.HashSet)

Aggregations

AlarmStatus (org.thingsboard.server.common.data.alarm.AlarmStatus)7 AlarmSearchStatus (org.thingsboard.server.common.data.alarm.AlarmSearchStatus)4 EntityId (org.thingsboard.server.common.data.id.EntityId)4 ApiOperation (io.swagger.annotations.ApiOperation)3 PreAuthorize (org.springframework.security.access.prepost.PreAuthorize)3 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)3 ResponseBody (org.springframework.web.bind.annotation.ResponseBody)3 ThingsboardException (org.thingsboard.server.common.data.exception.ThingsboardException)3 AlarmQuery (org.thingsboard.server.common.data.alarm.AlarmQuery)2 TimePageLink (org.thingsboard.server.common.data.page.TimePageLink)2 IOException (java.io.IOException)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 TbNodeException (org.thingsboard.rule.engine.api.TbNodeException)1 Alarm (org.thingsboard.server.common.data.alarm.Alarm)1 AlarmSeverity (org.thingsboard.server.common.data.alarm.AlarmSeverity)1 AlarmDataPageLink (org.thingsboard.server.common.data.query.AlarmDataPageLink)1 EntityDataSortOrder (org.thingsboard.server.common.data.query.EntityDataSortOrder)1