From 08679cf561c24842735b61efae35f85253e535a7 Mon Sep 17 00:00:00 2001 From: yevhenii Date: Tue, 29 Apr 2025 11:33:50 +0300 Subject: [PATCH 1/2] PostgreSQL View for active Edges - Moved filtering logic for active edges from inline native query to a database view (edge_active_attribute_view) to simplify the query and improve maintainability. --- .../server/dao/sql/edge/EdgeRepository.java | 13 ++++--------- .../sql/schema-views-and-functions.sql | 19 +++++++++++++++++++ .../resources/sql/psql/drop-all-tables.sql | 1 + 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java index bd1dda54b8..66d65cf602 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java @@ -44,15 +44,10 @@ public interface EdgeRepository extends JpaRepository { "WHERE d.id = :edgeId") EdgeInfoEntity findEdgeInfoById(@Param("edgeId") UUID edgeId); - @Query(value = "SELECT ee.id, ee.created_time, ee.additional_info, ee.customer_id, " + - "ee.root_rule_chain_id, ee.type, ee.name, ee.label, ee.routing_key, " + - "ee.secret, ee.tenant_id, ee.version " + - "FROM edge ee " + - "JOIN attribute_kv ON ee.id = attribute_kv.entity_id " + - "JOIN key_dictionary ON attribute_kv.attribute_key = key_dictionary.key_id " + - "WHERE attribute_kv.bool_v = true AND key_dictionary.key = 'active' " + - "AND (:textSearch IS NULL OR ee.name ILIKE CONCAT('%', :textSearch, '%')) " + - "ORDER BY ee.id", nativeQuery = true) + @Query(value = "SELECT * " + + "FROM edge_active_attribute_view edge_active " + + "WHERE (:textSearch IS NULL OR edge_active.name ILIKE CONCAT('%', :textSearch, '%')) " + + "ORDER BY edge_active.id", nativeQuery = true) Page findActiveEdges(@Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/resources/sql/schema-views-and-functions.sql b/dao/src/main/resources/sql/schema-views-and-functions.sql index a1abef81ca..b65dc41a90 100644 --- a/dao/src/main/resources/sql/schema-views-and-functions.sql +++ b/dao/src/main/resources/sql/schema-views-and-functions.sql @@ -72,6 +72,25 @@ u.first_name as assignee_first_name, u.last_name as assignee_last_name, u.email FROM alarm a LEFT JOIN tb_user u ON u.id = a.assignee_id; +DROP VIEW IF EXISTS edge_active_attribute_view CASCADE; +CREATE OR REPLACE VIEW edge_active_attribute_view AS +SELECT ee.id + , ee.created_time + , ee.additional_info + , ee.customer_id + , ee.root_rule_chain_id + , ee.type + , ee.name + , ee.label + , ee.routing_key + , ee.secret + , ee.tenant_id + , ee.version +FROM edge ee + JOIN attribute_kv ON ee.id = attribute_kv.entity_id + JOIN key_dictionary ON attribute_kv.attribute_key = key_dictionary.key_id +WHERE attribute_kv.bool_v = true AND key_dictionary.key = 'active'; + CREATE OR REPLACE FUNCTION create_or_update_active_alarm( t_id uuid, c_id uuid, a_id uuid, a_created_ts bigint, a_o_id uuid, a_o_type integer, a_type varchar, diff --git a/dao/src/test/resources/sql/psql/drop-all-tables.sql b/dao/src/test/resources/sql/psql/drop-all-tables.sql index da6eca161b..0387658f2d 100644 --- a/dao/src/test/resources/sql/psql/drop-all-tables.sql +++ b/dao/src/test/resources/sql/psql/drop-all-tables.sql @@ -14,6 +14,7 @@ DROP VIEW IF EXISTS device_info_active_attribute_view CASCADE; DROP VIEW IF EXISTS device_info_active_ts_view CASCADE; DROP VIEW IF EXISTS device_info_view CASCADE; DROP VIEW IF EXISTS alarm_info CASCADE; +DROP VIEW IF EXISTS edge_acitve_attribute_view CASCADE; DROP TABLE IF EXISTS admin_settings; DROP TABLE IF EXISTS entity_alarm; From f990cad134747a831deed49f139801591133af20 Mon Sep 17 00:00:00 2001 From: Yevhenii Date: Wed, 21 May 2025 12:37:42 +0300 Subject: [PATCH 2/2] PostgreSQL View for active Edges - removed testSearch --- .../server/dao/sql/edge/EdgeRepository.java | 11 +++++------ .../thingsboard/server/dao/sql/edge/JpaEdgeDao.java | 5 +---- .../main/resources/sql/schema-views-and-functions.sql | 3 ++- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java index 66d65cf602..09802e9ca6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/EdgeRepository.java @@ -44,12 +44,10 @@ public interface EdgeRepository extends JpaRepository { "WHERE d.id = :edgeId") EdgeInfoEntity findEdgeInfoById(@Param("edgeId") UUID edgeId); - @Query(value = "SELECT * " + - "FROM edge_active_attribute_view edge_active " + - "WHERE (:textSearch IS NULL OR edge_active.name ILIKE CONCAT('%', :textSearch, '%')) " + - "ORDER BY edge_active.id", nativeQuery = true) - Page findActiveEdges(@Param("textSearch") String textSearch, - Pageable pageable); + @Query(value = "SELECT * FROM edge_active_attribute_view edge_active", + countQuery = "SELECT count(*) FROM edge_active_attribute_view", + nativeQuery = true) + Page findActiveEdges(Pageable pageable); @Query("SELECT d.id FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") @@ -166,4 +164,5 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT new org.thingsboard.server.common.data.edqs.fields.EdgeFields(e.id, e.createdTime, e.tenantId, e.customerId," + "e.name, e.version, e.type, e.label, e.additionalInfo) FROM EdgeEntity e WHERE e.id > :id ORDER BY e.id") List findNextBatch(@Param("id") UUID id, Limit limit); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java index 50b8092731..53ba6cf357 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaEdgeDao.java @@ -68,10 +68,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge @Override public PageData findActiveEdges(PageLink pageLink) { - return DaoUtil.toPageData( - edgeRepository.findActiveEdges( - pageLink.getTextSearch(), - DaoUtil.toPageable(pageLink))); + return DaoUtil.toPageData(edgeRepository.findActiveEdges(DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/main/resources/sql/schema-views-and-functions.sql b/dao/src/main/resources/sql/schema-views-and-functions.sql index b65dc41a90..a6a7ae43cb 100644 --- a/dao/src/main/resources/sql/schema-views-and-functions.sql +++ b/dao/src/main/resources/sql/schema-views-and-functions.sql @@ -89,7 +89,8 @@ SELECT ee.id FROM edge ee JOIN attribute_kv ON ee.id = attribute_kv.entity_id JOIN key_dictionary ON attribute_kv.attribute_key = key_dictionary.key_id -WHERE attribute_kv.bool_v = true AND key_dictionary.key = 'active'; +WHERE attribute_kv.bool_v = true AND key_dictionary.key = 'active' +ORDER BY ee.id; CREATE OR REPLACE FUNCTION create_or_update_active_alarm( t_id uuid, c_id uuid, a_id uuid, a_created_ts bigint,