From ffa00bd94aa4bdf923a215019ad6247d4c00fe37 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 22 Aug 2023 16:59:01 +0200 Subject: [PATCH] refactoring due to comments --- .../src/main/data/upgrade/3.5.1/schema_update.sql | 8 +++++++- .../server/controller/AlarmControllerTest.java | 11 ++++++++++- .../server/common/data/page/PageData.java | 7 +++++++ .../java/org/thingsboard/server/dao/DaoUtil.java | 14 ++++++++------ .../server/dao/alarm/BaseAlarmService.java | 1 + .../server/dao/sql/alarm/AlarmRepository.java | 2 +- .../server/dao/sql/alarm/JpaAlarmDao.java | 2 +- dao/src/main/resources/sql/schema-entities-idx.sql | 6 ++++++ dao/src/main/resources/sql/schema-entities.sql | 2 +- 9 files changed, 42 insertions(+), 11 deletions(-) diff --git a/application/src/main/data/upgrade/3.5.1/schema_update.sql b/application/src/main/data/upgrade/3.5.1/schema_update.sql index 88d76f600b..aaf855e4c6 100644 --- a/application/src/main/data/upgrade/3.5.1/schema_update.sql +++ b/application/src/main/data/upgrade/3.5.1/schema_update.sql @@ -131,7 +131,13 @@ CREATE TABLE IF NOT EXISTS alarm_types ( tenant_id uuid NOT NULL, type varchar(255) NOT NULL, CONSTRAINT tenant_id_type_unq_key UNIQUE (tenant_id, type) - ); +); + +-- Activate the pg_trgm module for trigram-based searches. +CREATE EXTENSION IF NOT EXISTS pg_trgm; + +-- Create a GIN index on the `type` column. (for optimizing `ILIKE` in search query) +CREATE INDEX IF NOT EXISTS idx_gin_alarm_types_type ON alarm_types USING GIN(type gin_trgm_ops); INSERT INTO alarm_types (tenant_id, type) SELECT DISTINCT tenant_id, type FROM alarm ON CONFLICT (tenant_id, type) DO NOTHING; diff --git a/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java index 6e6cfacaca..ae65745c84 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AlarmControllerTest.java @@ -801,7 +801,7 @@ public class AlarmControllerTest extends AbstractControllerTest { } @Test - public void testGetAlarmTypes() throws Exception { + public void testSaveAlarmTypes() throws Exception { loginTenantAdmin(); List types = new ArrayList<>(); @@ -810,6 +810,15 @@ public class AlarmControllerTest extends AbstractControllerTest { types.add(createAlarm(TEST_ALARM_TYPE + i).getType()); } + Device device = new Device(); + device.setName("Test device 2"); + device.setCustomerId(customerId); + customerDevice = doPost("/api/device", device, Device.class); + + for (int i = 1; i < 10; i++) { + createAlarm(TEST_ALARM_TYPE + i); + } + List foundTypes = doGetTyped("/api/alarm/types?pageSize=1024&page=0", new TypeReference>() { }) .getData() diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/page/PageData.java b/common/data/src/main/java/org/thingsboard/server/common/data/page/PageData.java index 6ccf49bd13..6eb9218956 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/page/PageData.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/page/PageData.java @@ -29,6 +29,8 @@ import java.util.stream.Collectors; @ApiModel public class PageData implements Serializable { + public static final PageData EMPTY_PAGE_DATA = new PageData<>(); + private final List data; private final int totalPages; private final long totalElements; @@ -49,6 +51,11 @@ public class PageData implements Serializable { this.hasNext = hasNext; } + @SuppressWarnings("unchecked") + public static PageData emptyPageData() { + return (PageData) EMPTY_PAGE_DATA; + } + @ApiModelProperty(position = 1, value = "Array of the entities", accessMode = ApiModelProperty.AccessMode.READ_ONLY) public List getData() { return data; diff --git a/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java b/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java index 4b407cb669..0a6c498745 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java +++ b/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.util.CollectionUtils; import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.TenantId; @@ -147,12 +148,13 @@ public abstract class DaoUtil { } public static List convertTenantEntityTypesToDto(UUID tenantId, EntityType entityType, List types) { - List list = Collections.emptyList(); - if (types != null && !types.isEmpty()) { - list = new ArrayList<>(); - for (String type : types) { - list.add(new EntitySubtype(TenantId.fromUUID(tenantId), entityType, type)); - } + if (CollectionUtils.isEmpty(types)) { + return Collections.emptyList(); + } + + List list = new ArrayList<>(types.size()); + for (String type : types) { + list.add(new EntitySubtype(TenantId.fromUUID(tenantId), entityType, type)); } return list; } 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 00a781cdc1..148d79abe5 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 @@ -241,6 +241,7 @@ public class BaseAlarmService extends AbstractCachedEntityService types) { if (!types.isEmpty() && alarmDao.removeAlarmTypes(tenantId.getId(), types)) { publishEvictEvent(new AlarmTypesCacheEvictEvent(tenantId)); 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 ab86b5afe3..bf5b6d84e7 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 @@ -348,7 +348,7 @@ public interface AlarmRepository extends JpaRepository { @Query(value = "SELECT unassign_alarm(:t_id, :a_id, :a_ts)", nativeQuery = true) String unassignAlarm(@Param("t_id") UUID tenantId, @Param("a_id") UUID alarmId, @Param("a_ts") long unassignTime); - @Query(value = "SELECT at.type FROM alarm_types AS at WHERE at.tenant_id = :tenantId AND LOWER(at.type) LIKE LOWER(CONCAT('%', :searchText, '%'))", nativeQuery = true) + @Query(value = "SELECT at.type FROM alarm_types AS at WHERE at.tenant_id = :tenantId AND at.type ILIKE CONCAT('%', :searchText, '%')", nativeQuery = true) Page findTenantAlarmTypes(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Transactional 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 15b576e391..b0166a86a4 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 @@ -375,7 +375,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A public PageData findTenantAlarmTypes(UUID tenantId, PageLink pageLink) { Page page = alarmRepository.findTenantAlarmTypes(tenantId, Objects.toString(pageLink.getTextSearch(), ""), toPageable(pageLink)); if (page.isEmpty()) { - return new PageData<>(); + return PageData.emptyPageData(); } List data = convertTenantEntityTypesToDto(tenantId, EntityType.ALARM, page.getContent()); diff --git a/dao/src/main/resources/sql/schema-entities-idx.sql b/dao/src/main/resources/sql/schema-entities-idx.sql index 675fcd3ec0..0f26974668 100644 --- a/dao/src/main/resources/sql/schema-entities-idx.sql +++ b/dao/src/main/resources/sql/schema-entities-idx.sql @@ -115,3 +115,9 @@ CREATE INDEX IF NOT EXISTS idx_notification_id ON notification(id); CREATE INDEX IF NOT EXISTS idx_notification_recipient_id_created_time ON notification(recipient_id, created_time DESC); CREATE INDEX IF NOT EXISTS idx_notification_recipient_id_unread ON notification(recipient_id) WHERE status <> 'READ'; + +-- Activate the pg_trgm module for trigram-based searches. +CREATE EXTENSION IF NOT EXISTS pg_trgm; + +-- Create a GIN index on the `type` column. (for optimizing `ILIKE` in search query) +CREATE INDEX IF NOT EXISTS idx_gin_alarm_types_type ON alarm_types USING GIN(type gin_trgm_ops); diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index 4798d98f6f..2f73340ac1 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -25,7 +25,7 @@ CREATE OR REPLACE PROCEDURE insert_tb_schema_settings() $$ BEGIN IF (SELECT COUNT(*) FROM tb_schema_settings) = 0 THEN - INSERT INTO tb_schema_settings (schema_version) VALUES (3003000); + INSERT INTO tb_schema_settings (schema_version) VALUES (3005002); END IF; END; $$;