From 1a4414dca7c4b6ea4c65759c4b37b56c4564e08e Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Fri, 15 Sep 2023 13:27:24 +0300 Subject: [PATCH 1/3] added null-check for search text in sql queries and replaced 'LIKE' operator with case insensetive function 'ilike' --- .../src/main/resources/thingsboard.yml | 1 + .../dao/ThingsboardPostgreSQLDialect.java | 26 +++++++ .../server/dao/sql/alarm/AlarmRepository.java | 72 +++++++++---------- .../server/dao/sql/alarm/JpaAlarmDao.java | 12 ++-- .../dao/sql/asset/AssetProfileRepository.java | 4 +- .../server/dao/sql/asset/AssetRepository.java | 40 +++++------ .../server/dao/sql/asset/JpaAssetDao.java | 26 +++---- .../dao/sql/asset/JpaAssetProfileDao.java | 4 +- .../dao/sql/audit/AuditLogRepository.java | 36 +++++----- .../server/dao/sql/audit/JpaAuditLogDao.java | 8 +-- .../ComponentDescriptorRepository.java | 6 +- .../JpaBaseComponentDescriptorDao.java | 4 +- .../dao/sql/customer/CustomerRepository.java | 2 +- .../dao/sql/customer/JpaCustomerDao.java | 2 +- .../dashboard/DashboardInfoRepository.java | 10 +-- .../sql/dashboard/JpaDashboardInfoDao.java | 10 +-- .../sql/device/DeviceProfileRepository.java | 12 ++-- .../dao/sql/device/DeviceRepository.java | 48 ++++++------- .../server/dao/sql/device/JpaDeviceDao.java | 18 ++--- .../dao/sql/device/JpaDeviceProfileDao.java | 6 +- .../dao/sql/edge/EdgeEventRepository.java | 2 +- .../server/dao/sql/edge/EdgeRepository.java | 18 ++--- .../dao/sql/edge/JpaBaseEdgeEventDao.java | 2 +- .../server/dao/sql/edge/JpaEdgeDao.java | 18 ++--- .../sql/entityview/EntityViewRepository.java | 20 +++--- .../dao/sql/entityview/JpaEntityViewDao.java | 20 +++--- .../sql/notification/JpaNotificationDao.java | 4 +- .../JpaNotificationRequestDao.java | 2 +- .../notification/JpaNotificationRuleDao.java | 4 +- .../JpaNotificationTargetDao.java | 6 +- .../JpaNotificationTemplateDao.java | 2 +- .../notification/NotificationRepository.java | 8 +-- .../NotificationRequestRepository.java | 2 +- .../NotificationRuleRepository.java | 4 +- .../NotificationTargetRepository.java | 4 +- .../NotificationTemplateRepository.java | 4 +- .../dao/sql/ota/JpaOtaPackageInfoDao.java | 4 +- .../dao/sql/ota/OtaPackageInfoRepository.java | 4 +- .../query/DefaultAlarmQueryRepository.java | 2 +- .../query/DefaultEntityQueryRepository.java | 14 ++-- .../server/dao/sql/queue/JpaQueueDao.java | 2 +- .../server/dao/sql/queue/QueueRepository.java | 2 +- .../dao/sql/resource/JpaTbResourceDao.java | 4 +- .../sql/resource/JpaTbResourceInfoDao.java | 2 +- .../resource/TbResourceInfoRepository.java | 4 +- .../sql/resource/TbResourceRepository.java | 4 +- .../server/dao/sql/rule/JpaRuleChainDao.java | 8 +-- .../dao/sql/rule/RuleChainRepository.java | 8 +-- .../server/dao/sql/tenant/JpaTenantDao.java | 4 +- .../dao/sql/tenant/JpaTenantProfileDao.java | 4 +- .../sql/tenant/TenantProfileRepository.java | 4 +- .../dao/sql/tenant/TenantRepository.java | 4 +- .../server/dao/sql/user/JpaUserDao.java | 8 +-- .../server/dao/sql/user/UserRepository.java | 6 +- .../dao/sql/widget/JpaWidgetTypeDao.java | 8 +-- .../dao/sql/widget/JpaWidgetsBundleDao.java | 6 +- .../dao/sql/widget/WidgetTypeRepository.java | 14 ++-- .../sql/widget/WidgetsBundleRepository.java | 6 +- .../resources/application-test.properties | 2 + 59 files changed, 310 insertions(+), 281 deletions(-) create mode 100644 dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 306e9a798c..cff2a67ad1 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -623,6 +623,7 @@ spring.servlet.multipart.max-request-size: "50MB" spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation: "true" # Note: as for current Spring JPA version, custom NullHandling for the Sort.Order is ignored and this parameter is used spring.jpa.properties.hibernate.order_by.default_null_ordering: "${SPRING_JPA_PROPERTIES_HIBERNATE_ORDER_BY_DEFAULT_NULL_ORDERING:last}" +spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # SQL DAO Configuration spring: diff --git a/dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java b/dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java new file mode 100644 index 0000000000..1c70f7387c --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/ThingsboardPostgreSQLDialect.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2023 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 + * + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.dao; + +import org.hibernate.dialect.function.SQLFunctionTemplate; +import org.hibernate.type.BooleanType; + +public class ThingsboardPostgreSQLDialect extends org.hibernate.dialect.PostgreSQL10Dialect { + public ThingsboardPostgreSQLDialect() { + super(); + registerFunction("ilike", new SQLFunctionTemplate(BooleanType.INSTANCE, "(?1 ILIKE ?2)")); + } +} 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 30b6c5191d..dc1f9114dd 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 @@ -58,9 +58,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + //alarms with relations only @@ -75,9 +75,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAlarms(@Param("tenantId") UUID tenantId, @Param("affectedEntityId") UUID affectedEntityId, @Param("affectedEntityType") String affectedEntityType, @@ -105,9 +105,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + //alarms with relations only @@ -124,9 +124,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAlarmsV2(@Param("tenantId") UUID tenantId, @Param("affectedEntityId") UUID affectedEntityId, @Param("affectedEntityType") String affectedEntityType, @@ -150,9 +150,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ", + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) ", countQuery = "" + "SELECT count(a) " + "FROM AlarmInfoEntity a " + @@ -162,9 +162,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAllAlarms(@Param("tenantId") UUID tenantId, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @@ -186,9 +186,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ", + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) ", countQuery = "" + "SELECT count(a) " + "FROM AlarmInfoEntity a " + @@ -200,9 +200,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findAllAlarmsV2(@Param("tenantId") UUID tenantId, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @@ -224,9 +224,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + @@ -237,9 +237,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findCustomerAlarms(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("startTime") Long startTime, @@ -262,9 +262,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) " + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true)) " , countQuery = "" + "SELECT count(a) " + @@ -277,9 +277,9 @@ public interface AlarmRepository extends JpaRepository { "AND ((:clearFilterEnabled) IS FALSE OR a.cleared = :clearFilter) " + "AND ((:ackFilterEnabled) IS FALSE OR a.acknowledged = :ackFilter) " + "AND (:assigneeId IS NULL OR a.assigneeId = uuid(:assigneeId)) " + - "AND (LOWER(a.type) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.severity) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - " OR LOWER(a.status) LIKE LOWER(CONCAT('%', :searchText, '%'))) ") + "AND (:searchText IS NULL OR (ilike(a.type, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.severity, CONCAT('%', :searchText, '%')) = true " + + " OR ilike(a.status, CONCAT('%', :searchText, '%')) = true))") Page findCustomerAlarmsV2(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("startTime") Long startTime, 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 358c4aa019..b3aeec305f 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 @@ -155,7 +155,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -170,7 +170,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -192,7 +192,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -220,7 +220,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -237,7 +237,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); @@ -263,7 +263,7 @@ public class JpaAlarmDao extends JpaAbstractDao implements A asf.hasAckFilter(), asf.hasAckFilter() && asf.getAckFilter(), DaoUtil.getStringId(query.getAssigneeId()), - Objects.toString(query.getPageLink().getTextSearch(), ""), + query.getPageLink().getTextSearch(), DaoUtil.toPageable(query.getPageLink()) ) ); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java index b18f80bcd8..f23478e6d5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetProfileRepository.java @@ -34,14 +34,14 @@ public interface AssetProfileRepository extends JpaRepository findAssetProfiles(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.asset.AssetProfileInfo(a.id, a.tenantId, a.name, a.image, a.defaultDashboardId) " + "FROM AssetProfileEntity a WHERE " + - "a.tenantId = :tenantId AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "a.tenantId = :tenantId AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findAssetProfileInfos(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java index b14f346cd4..c16afc9983 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java @@ -41,7 +41,7 @@ public interface AssetRepository extends JpaRepository, Expor AssetInfoEntity findAssetInfoById(@Param("assetId") UUID assetId); @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @@ -51,17 +51,17 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN CustomerEntity c on c.id = a.customerId " + "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + - "AND (LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(a.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(p.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(a.label, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(p.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true) ") Page findAssetInfosByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -69,7 +69,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.assetProfileId = :profileId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId, @Param("profileId") UUID profileId, @Param("searchText") String searchText, @@ -81,7 +81,7 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findAssetInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -95,7 +95,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -107,9 +107,9 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + "AND a.type = :type " + - "AND (LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(a.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(a.label, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true) ") Page findAssetInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -121,9 +121,9 @@ public interface AssetRepository extends JpaRepository, Expor "LEFT JOIN AssetProfileEntity p on p.id = a.assetProfileId " + "WHERE a.tenantId = :tenantId " + "AND a.assetProfileId = :assetProfileId " + - "AND (LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(a.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(a.label, CONCAT('%', :textSearch, '%')) = true " + + " OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true) ") Page findAssetInfosByTenantIdAndAssetProfileId(@Param("tenantId") UUID tenantId, @Param("assetProfileId") UUID assetProfileId, @Param("textSearch") String textSearch, @@ -132,7 +132,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -146,7 +146,7 @@ public interface AssetRepository extends JpaRepository, Expor "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findAssetInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -160,7 +160,7 @@ public interface AssetRepository extends JpaRepository, Expor "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + "AND a.assetProfileId = :assetProfileId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findAssetInfosByTenantIdAndCustomerIdAndAssetProfileId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("assetProfileId") UUID assetProfileId, @@ -175,7 +175,7 @@ public interface AssetRepository extends JpaRepository, Expor @Query("SELECT a FROM AssetEntity a, RelationEntity re WHERE a.tenantId = :tenantId " + "AND a.id = re.toId AND re.toType = 'ASSET' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, @@ -185,7 +185,7 @@ public interface AssetRepository extends JpaRepository, Expor "AND a.id = re.toId AND re.toType = 'ASSET' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("type") String type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java index 4c83815d19..e2fe60945d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java @@ -77,7 +77,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A return DaoUtil.toPageData(assetRepository .findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -86,7 +86,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A return DaoUtil.toPageData( assetRepository.findAssetInfosByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -102,7 +102,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A .findByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -112,7 +112,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findAssetInfosByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -134,7 +134,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A .findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -144,7 +144,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findAssetInfosByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -154,7 +154,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findAssetInfosByTenantIdAndAssetProfileId( tenantId, assetProfileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -165,7 +165,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -176,7 +176,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -187,7 +187,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, customerId, assetProfileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, AssetInfoEntity.assetInfoColumnMap))); } @@ -207,7 +207,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A assetRepository.findByTenantIdAndProfileId( tenantId, profileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -218,7 +218,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A .findByTenantIdAndEdgeId( tenantId, edgeId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -230,7 +230,7 @@ public class JpaAssetDao extends JpaAbstractDao implements A tenantId, edgeId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java index fb709b56dc..e34df2f21c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetProfileDao.java @@ -69,7 +69,7 @@ public class JpaAssetProfileDao extends JpaAbstractDao "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.userName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.userName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findByTenantId( @Param("tenantId") UUID tenantId, @@ -54,10 +54,10 @@ public interface AuditLogRepository extends JpaRepository "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.userName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.userName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findAuditLogsByTenantIdAndEntityId(@Param("tenantId") UUID tenantId, @Param("entityType") EntityType entityType, @@ -74,11 +74,11 @@ public interface AuditLogRepository extends JpaRepository "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.userName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.userName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @@ -94,10 +94,10 @@ public interface AuditLogRepository extends JpaRepository "AND (:startTime IS NULL OR a.createdTime >= :startTime) " + "AND (:endTime IS NULL OR a.createdTime <= :endTime) " + "AND ((:actionTypes) IS NULL OR a.actionType in (:actionTypes)) " + - "AND (LOWER(a.entityType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.entityName) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + - "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT('%', :textSearch, '%')))" + "AND (:textSearch IS NULL OR ilike(a.entityType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.entityName, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionType, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(a.actionStatus, CONCAT('%', :textSearch, '%')) = true)" ) Page findAuditLogsByTenantIdAndUserId(@Param("tenantId") UUID tenantId, @Param("userId") UUID userId, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java index a605f515d0..f9cbefbca1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java @@ -99,7 +99,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp tenantId, entityId.getEntityType(), entityId.getId(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, @@ -113,7 +113,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp .findAuditLogsByTenantIdAndCustomerId( tenantId, customerId.getId(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, @@ -127,7 +127,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp .findAuditLogsByTenantIdAndUserId( tenantId, userId.getId(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, @@ -139,7 +139,7 @@ public class JpaAuditLogDao extends JpaAbstractDao imp return DaoUtil.toPageData( auditLogRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), pageLink.getStartTime(), pageLink.getEndTime(), actionTypes, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java index aef31602fb..e5b65f5473 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java @@ -36,13 +36,13 @@ public interface ComponentDescriptorRepository extends JpaRepository findByType(@Param("type") ComponentType type, @Param("textSearch") String textSearch, Pageable pageable); - @Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type " + - "AND cd.scope = :scope AND LOWER(cd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + @Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type AND cd.scope = :scope " + + "AND (:textSearch IS NULL OR ilike(cd.name, CONCAT('%', :textSearch, '%')) = true)") Page findByScopeAndType(@Param("type") ComponentType type, @Param("scope") ComponentScope scope, @Param("textSearch") String textSearch, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java index 58a6c784cb..24ed28383c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java @@ -89,7 +89,7 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractDao, ExportableEntityRepository { @Query("SELECT c FROM CustomerEntity c WHERE c.tenantId = :tenantId " + - "AND LOWER(c.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(c.title, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java index a10ea6765c..6dd03625b9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java @@ -58,7 +58,7 @@ public class JpaCustomerDao extends JpaAbstractDao imp public PageData findCustomersByTenantId(UUID tenantId, PageLink pageLink) { return DaoUtil.toPageData(customerRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java index d8b07e9364..bddda18563 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java @@ -32,14 +32,14 @@ public interface DashboardInfoRepository extends JpaRepository findByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " + "AND di.mobileHide = false " + - "AND LOWER(di.title) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(di.title, CONCAT('%', :searchText, '%')) = true)") Page findMobileByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @@ -47,7 +47,7 @@ public interface DashboardInfoRepository extends JpaRepository findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -57,7 +57,7 @@ public interface DashboardInfoRepository extends JpaRepository findMobileByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -66,7 +66,7 @@ public interface DashboardInfoRepository extends JpaRepository findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java index 2e2148f089..b988048db8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java @@ -60,7 +60,7 @@ public class JpaDashboardInfoDao extends JpaAbstractDao findDeviceProfiles(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.DeviceProfileInfo(d.id, d.tenantId, d.name, d.image, d.defaultDashboardId, d.type, d.transportType) " + - "FROM DeviceProfileEntity d WHERE " + - "d.tenantId = :tenantId AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "FROM DeviceProfileEntity d WHERE d.tenantId = :tenantId " + + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceProfileInfos(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.DeviceProfileInfo(d.id, d.tenantId, d.name, d.image, d.defaultDashboardId, d.type, d.transportType) " + - "FROM DeviceProfileEntity d WHERE " + - "d.tenantId = :tenantId AND d.transportType = :transportType AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "FROM DeviceProfileEntity d WHERE d.tenantId = :tenantId AND d.transportType = :transportType " + + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceProfileInfos(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, @Param("transportType") DeviceTransportType transportType, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java index 56f6a7c647..3ca96e7087 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java @@ -35,8 +35,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -44,8 +44,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.deviceProfileId = :profileId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId, @Param("profileId") UUID profileId, @Param("textSearch") String textSearch, @@ -54,8 +54,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceInfoEntity d " + "WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -66,16 +66,16 @@ public interface DeviceRepository extends JpaRepository, Exp Pageable pageable); @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.type = :type " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -84,8 +84,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.deviceProfileId = :deviceProfileId " + "AND d.firmwareId = null " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndTypeAndFirmwareIdIsNull(@Param("tenantId") UUID tenantId, @Param("deviceProfileId") UUID deviceProfileId, @Param("textSearch") String textSearch, @@ -94,8 +94,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.deviceProfileId = :deviceProfileId " + "AND d.softwareId = null " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndTypeAndSoftwareIdIsNull(@Param("tenantId") UUID tenantId, @Param("deviceProfileId") UUID deviceProfileId, @Param("textSearch") String textSearch, @@ -116,8 +116,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + "AND d.type = :type " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -131,10 +131,10 @@ public interface DeviceRepository extends JpaRepository, Exp "AND ((:deviceType) IS NULL OR d.type = :deviceType) " + "AND (:deviceProfileId IS NULL OR d.deviceProfileId = uuid(:deviceProfileId)) " + "AND ((:filterByActive) IS FALSE OR d.active = :deviceActive) " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.type) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.customerTitle) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.type, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.customerTitle, CONCAT('%', :textSearch, '%')) = true)") Page findDeviceInfosByFilter(@Param("tenantId") UUID tenantId, @Param("customerId") String customerId, @Param("edgeId") String edgeId, @@ -163,8 +163,8 @@ public interface DeviceRepository extends JpaRepository, Exp @Query("SELECT d FROM DeviceEntity d, RelationEntity re WHERE d.tenantId = :tenantId " + "AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("textSearch") String textSearch, @@ -174,8 +174,8 @@ public interface DeviceRepository extends JpaRepository, Exp "AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " + "AND d.type = :type " + - "AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " + - "OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true " + + "OR ilike(d.label, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("type") String type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java index 9b63e945ea..bf7d8670b1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java @@ -98,7 +98,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement return DaoUtil.toPageData( deviceRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } } @@ -114,7 +114,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement DaoUtil.getStringId(filter.getDeviceProfileId()), filter.getActive() != null, Boolean.TRUE.equals(filter.getActive()), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -139,7 +139,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement deviceRepository.findByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -149,7 +149,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement deviceRepository.findByTenantIdAndProfileId( tenantId, profileId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -176,7 +176,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement deviceRepository.findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -186,7 +186,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement OtaPackageType type, PageLink pageLink) { Pageable pageable = DaoUtil.toPageable(pageLink); - String searchText = Objects.toString(pageLink.getTextSearch(), ""); + String searchText = pageLink.getTextSearch(); Page page = OtaPackageUtil.getByOtaPackageType( () -> deviceRepository.findByTenantIdAndTypeAndFirmwareIdIsNull(tenantId, deviceProfileId, searchText, pageable), () -> deviceRepository.findByTenantIdAndTypeAndSoftwareIdIsNull(tenantId, deviceProfileId, searchText, pageable), @@ -211,7 +211,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -247,7 +247,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement .findByTenantIdAndEdgeId( tenantId, edgeId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -259,7 +259,7 @@ public class JpaDeviceDao extends JpaAbstractDao implement tenantId, edgeId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java index f500600722..7b334330fd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceProfileDao.java @@ -73,7 +73,7 @@ public class JpaDeviceProfileDao extends JpaAbstractDao :seqIdStart) " + "AND (:seqIdEnd IS NULL OR e.seqId < :seqIdEnd) " + - "AND LOWER(e.edgeEventType) LIKE LOWER(CONCAT('%', :textSearch, '%'))" + "AND (:textSearch IS NULL OR ilike(e.edgeEventType, CONCAT('%', :textSearch, '%')) = true)" ) Page findEdgeEventsByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, 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 533421015b..f632ef92ef 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 @@ -30,7 +30,7 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("textSearch") String textSearch, @@ -43,7 +43,7 @@ public interface EdgeRepository extends JpaRepository { EdgeInfoEntity findEdgeInfoById(@Param("edgeId") UUID edgeId); @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @@ -52,14 +52,14 @@ public interface EdgeRepository extends JpaRepository { "FROM EdgeEntity d " + "LEFT JOIN CustomerEntity c on c.id = d.customerId " + "WHERE d.tenantId = :tenantId " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND d.type = :type " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -70,7 +70,7 @@ public interface EdgeRepository extends JpaRepository { "LEFT JOIN CustomerEntity c on c.id = d.customerId " + "WHERE d.tenantId = :tenantId " + "AND d.type = :type " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -79,7 +79,7 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT d FROM EdgeEntity d WHERE d.tenantId = :tenantId " + "AND d.customerId = :customerId " + "AND d.type = :type " + - "AND LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(d.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -91,7 +91,7 @@ public interface EdgeRepository extends JpaRepository { "LEFT JOIN CustomerEntity c on c.id = a.customerId " + "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -103,7 +103,7 @@ public interface EdgeRepository extends JpaRepository { "WHERE a.tenantId = :tenantId " + "AND a.customerId = :customerId " + "AND a.type = :type " + - "AND LOWER(a.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(a.name, CONCAT('%', :textSearch, '%')) = true)") Page findEdgeInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -113,7 +113,7 @@ public interface EdgeRepository extends JpaRepository { @Query("SELECT ee FROM EdgeEntity ee, RelationEntity re WHERE ee.tenantId = :tenantId " + "AND ee.id = re.fromId AND re.fromType = 'EDGE' AND re.relationTypeGroup = 'EDGE' " + "AND re.relationType = 'Contains' AND re.toId = :entityId AND re.toType = :entityType " + - "AND LOWER(ee.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(ee.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndEntityId(@Param("tenantId") UUID tenantId, @Param("entityId") UUID entityId, @Param("entityType") String entityType, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java index 9f2eaae273..91aa61baf4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java @@ -185,7 +185,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractDao implements Edge return DaoUtil.toPageData( edgeRepository.findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -84,7 +84,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -106,7 +106,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -117,7 +117,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -127,7 +127,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findEdgeInfosByTenantIdAndCustomerId( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -138,7 +138,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge tenantId, customerId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -153,7 +153,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge edgeRepository.findEdgeInfosByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -162,7 +162,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge return DaoUtil.toPageData( edgeRepository.findEdgeInfosByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, EdgeInfoEntity.edgeInfoColumnMap))); } @@ -180,7 +180,7 @@ public class JpaEdgeDao extends JpaAbstractDao implements Edge tenantId, entityId, entityType.name(), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java index 1478e23a54..91dde5e36c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java @@ -39,7 +39,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @@ -48,14 +48,14 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " + "AND e.type = :type " + - "AND LOWER(e.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(e.name, CONCAT('%', :textSearch, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -66,7 +66,7 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") String type, @Param("textSearch") String textSearch, @@ -74,7 +74,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -85,7 +85,7 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -94,7 +94,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -107,7 +107,7 @@ public interface EntityViewRepository extends JpaRepository findEntityViewInfosByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("type") String type, @@ -124,7 +124,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, @@ -134,7 +134,7 @@ public interface EntityViewRepository extends JpaRepository findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("type") String type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java index e3e9edf80d..1bc9705eb6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java @@ -74,7 +74,7 @@ public class JpaEntityViewDao extends JpaAbstractDao findUnreadByRecipientIdAndPageLink(TenantId tenantId, UserId recipientId, PageLink pageLink) { return DaoUtil.toPageData(notificationRepository.findByRecipientIdAndStatusNot(recipientId.getId(), NotificationStatus.READ, - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override public PageData findByRecipientIdAndPageLink(TenantId tenantId, UserId recipientId, PageLink pageLink) { return DaoUtil.toPageData(notificationRepository.findByRecipientId(recipientId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java index 53b8318d3f..3464133fdd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRequestDao.java @@ -61,7 +61,7 @@ public class JpaNotificationRequestDao extends JpaAbstractDao findInfosByTenantIdAndOriginatorTypeAndPageLink(TenantId tenantId, EntityType originatorType, PageLink pageLink) { return DaoUtil.pageToPageData(notificationRequestRepository.findInfosByTenantIdAndOriginatorEntityTypeAndSearchText(tenantId.getId(), - originatorType, Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink, Map.of( + originatorType, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, Map.of( "templateName", "t.name" )))) .mapData(NotificationRequestInfoEntity::toData); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java index af9b8198e8..a5eb7ce527 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationRuleDao.java @@ -49,13 +49,13 @@ public class JpaNotificationRuleDao extends JpaAbstractDao findByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(notificationRuleRepository.findByTenantIdAndSearchText(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override public PageData findInfosByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { return DaoUtil.pageToPageData(notificationRuleRepository.findInfosByTenantIdAndSearchText(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink, Map.of( + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, Map.of( "templateName", "t.name" )))) .mapData(NotificationRuleInfoEntity::toData); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java index 64c679c845..bfa1d1b979 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTargetDao.java @@ -48,13 +48,13 @@ public class JpaNotificationTargetDao extends JpaAbstractDao findByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(notificationTargetRepository.findByTenantIdAndSearchText(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override public PageData findByTenantIdAndSupportedNotificationTypeAndPageLink(TenantId tenantId, NotificationType notificationType, PageLink pageLink) { return DaoUtil.toPageData(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), - Strings.nullToEmpty(pageLink.getTextSearch()), + pageLink.getTextSearch(), Arrays.stream(UsersFilterType.values()) .filter(type -> notificationType != NotificationType.GENERAL || !type.isForRules()) .map(Enum::name).collect(Collectors.toList()), @@ -68,7 +68,7 @@ public class JpaNotificationTargetDao extends JpaAbstractDao findByTenantIdAndUsersFilterType(TenantId tenantId, UsersFilterType filterType) { - return DaoUtil.convertDataList(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), "", + return DaoUtil.convertDataList(notificationTargetRepository.findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(tenantId.getId(), null, List.of(filterType.name()), DaoUtil.toPageable(new PageLink(Integer.MAX_VALUE))).getContent()); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java index 8a7cecb3d1..6e3e353b3d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/JpaNotificationTemplateDao.java @@ -50,7 +50,7 @@ public class JpaNotificationTemplateDao extends JpaAbstractDao findByTenantIdAndNotificationTypesAndPageLink(TenantId tenantId, List notificationTypes, PageLink pageLink) { return DaoUtil.toPageData(notificationTemplateRepository.findByTenantIdAndNotificationTypesAndSearchText(tenantId.getId(), - notificationTypes, Strings.nullToEmpty(pageLink.getTextSearch()), DaoUtil.toPageable(pageLink))); + notificationTypes, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java index c08a3c290e..cd4a538686 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRepository.java @@ -32,16 +32,16 @@ import java.util.UUID; public interface NotificationRepository extends JpaRepository { @Query("SELECT n FROM NotificationEntity n WHERE n.recipientId = :recipientId AND n.status <> :status " + - "AND (:searchText = '' OR lower(n.subject) LIKE lower(concat('%', :searchText, '%')) " + - "OR lower(n.text) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR ilike(n.subject, concat('%', :searchText, '%')) = true " + + "OR ilike(n.text, concat('%', :searchText, '%')) = true)") Page findByRecipientIdAndStatusNot(@Param("recipientId") UUID recipientId, @Param("status") NotificationStatus status, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT n FROM NotificationEntity n WHERE n.recipientId = :recipientId " + - "AND (:searchText = '' OR lower(n.subject) LIKE lower(concat('%', :searchText, '%')) " + - "OR lower(n.text) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR ilike(n.subject, concat('%', :searchText, '%')) = true " + + "OR ilike(n.text, concat('%', :searchText, '%')) = true)") Page findByRecipientId(@Param("recipientId") UUID recipientId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java index 126295616f..e7abd8e23f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRequestRepository.java @@ -41,7 +41,7 @@ public interface NotificationRequestRepository extends JpaRepository findByTenantIdAndOriginatorEntityType(UUID tenantId, EntityType originatorType, Pageable pageable); @Query(REQUEST_INFO_QUERY + " WHERE r.tenantId = :tenantId AND r.originatorEntityType = :originatorType " + - "AND (:searchText = '' OR t.name IS NOT NULL AND lower(t.name) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR (t.name IS NOT NULL AND ilike(t.name, concat('%', :searchText, '%')) = true))") Page findInfosByTenantIdAndOriginatorEntityTypeAndSearchText(@Param("tenantId") UUID tenantId, @Param("originatorType") EntityType originatorType, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java index 9dfb34c18d..a9d7b6544f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationRuleRepository.java @@ -37,7 +37,7 @@ public interface NotificationRuleRepository extends JpaRepository findByTenantIdAndSearchText(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @@ -52,7 +52,7 @@ public interface NotificationRuleRepository extends JpaRepository findInfosByTenantIdAndSearchText(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java index 278fea696e..c44f9f4d41 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTargetRepository.java @@ -32,13 +32,13 @@ import java.util.UUID; public interface NotificationTargetRepository extends JpaRepository, ExportableEntityRepository { @Query("SELECT t FROM NotificationTargetEntity t WHERE t.tenantId = :tenantId " + - "AND (:searchText = '' OR lower(t.name) LIKE lower(concat('%', :searchText, '%')))") + "AND (:searchText is NULL OR ilike(t.name, concat('%', :searchText, '%')) = true)") Page findByTenantIdAndSearchText(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Query(value = "SELECT * FROM notification_target t WHERE t.tenant_id = :tenantId " + - "AND (:searchText = '' OR lower(t.name) LIKE lower(concat('%', :searchText, '%'))) " + + "AND (:searchText IS NULL OR ilike(t.name, concat('%', :searchText, '%')) = true) " + "AND (cast(t.configuration as json) ->> 'type' <> 'PLATFORM_USERS' OR " + "cast(t.configuration as json) -> 'usersFilter' ->> 'type' IN :usersFilterTypes)", nativeQuery = true) Page findByTenantIdAndSearchTextAndUsersFilterTypeIfPresent(@Param("tenantId") UUID tenantId, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java index 73a25b98c3..5224c07de9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/notification/NotificationTemplateRepository.java @@ -34,8 +34,8 @@ public interface NotificationTemplateRepository extends JpaRepository findByTenantIdAndNotificationTypesAndSearchText(@Param("tenantId") UUID tenantId, @Param("notificationTypes") List notificationTypes, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java index f50dd6ed0f..8a65bee2e1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/ota/JpaOtaPackageInfoDao.java @@ -73,7 +73,7 @@ public class JpaOtaPackageInfoDao extends JpaAbstractDao { @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.tag, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, CASE WHEN (f.data IS NOT NULL OR f.url IS NOT NULL) THEN true ELSE false END) FROM OtaPackageEntity f WHERE " + "f.tenantId = :tenantId " + - "AND LOWER(f.title) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(f.title, CONCAT('%', :searchText, '%')) = true)") Page findAllByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @@ -38,7 +38,7 @@ public interface OtaPackageInfoRepository extends JpaRepository findAllByTenantIdAndTypeAndDeviceProfileIdAndHasData(@Param("tenantId") UUID tenantId, @Param("deviceProfileId") UUID deviceProfileId, @Param("type") OtaPackageType type, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java index 04e978c7d4..a707b9c196 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java @@ -406,7 +406,7 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { .map(mapping -> { String paramName = mapping + "_lowerSearchText"; ctx.addStringParameter(paramName, lowerSearchText); - return String.format("LOWER(cast(%s as varchar)) LIKE concat('%%', :%s, '%%')", mapping, paramName); + return String.format("cast(%s as varchar) ILIKE concat('%%', :%s, '%%')", mapping, paramName); } ).collect(Collectors.toList()); return String.format("%s", String.join(" or ", searchPredicates)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index 4cf6db0fc1..a49d8bbf24 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -801,8 +801,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { private String buildTextSearchQuery(QueryContext ctx, List selectionMapping, String searchText) { if (!StringUtils.isEmpty(searchText) && !selectionMapping.isEmpty()) { - String lowerSearchText = "%" + searchText.toLowerCase() + "%"; - ctx.addStringParameter("lowerSearchTextParam", lowerSearchText); + String sqlSearchText = "%" + searchText + "%"; + ctx.addStringParameter("lowerSearchTextParam", sqlSearchText); List searchAliases = selectionMapping.stream().filter(EntityKeyMapping::isSearchable).map(EntityKeyMapping::getValueAlias).collect(Collectors.toList()); String searchAliasesExpression; if (searchAliases.size() > 1) { @@ -810,7 +810,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { } else { searchAliasesExpression = searchAliases.get(0); } - return String.format(" WHERE LOWER(%s) LIKE :%s", searchAliasesExpression, "lowerSearchTextParam"); + return String.format(" WHERE %s ILIKE :%s", searchAliasesExpression, "lowerSearchTextParam"); } else { return ""; } @@ -830,10 +830,10 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter()); String nameColumn = getNameColumn(filter.getEntityType()); if (filter.getEntityNameFilter().startsWith("%") || filter.getEntityNameFilter().endsWith("%")) { - return String.format("lower(e.%s) like lower(:entity_filter_name_filter)", nameColumn); + return String.format("e.%s ilike :entity_filter_name_filter", nameColumn); } - return String.format("lower(e.%s) like lower(concat(:entity_filter_name_filter, '%%'))", nameColumn); + return String.format("e.%s ilike concat(:entity_filter_name_filter, '%%')", nameColumn); } private String typeQuery(QueryContext ctx, EntityFilter filter) { @@ -869,9 +869,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { if (!StringUtils.isEmpty(name)) { ctx.addStringParameter("entity_filter_type_query_name", name); if (name.startsWith("%") || name.endsWith("%")) { - return typesFilter + " and lower(e." + nameColumn + ") like lower(:entity_filter_type_query_name)"; + return typesFilter + " and e." + nameColumn + " ilike :entity_filter_type_query_name"; } - return typesFilter + " and lower(e." + nameColumn + ") like lower(concat(:entity_filter_type_query_name, '%%'))"; + return typesFilter + " and e." + nameColumn + " ilike concat(:entity_filter_type_query_name, '%%')"; } else { return typesFilter; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java index ed51f6cab0..7cd3314d5f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/JpaQueueDao.java @@ -84,6 +84,6 @@ public class JpaQueueDao extends JpaAbstractDao implements Q @Override public PageData findQueuesByTenantId(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(queueRepository - .findByTenantId(tenantId.getId(), Objects.toString(pageLink.getTextSearch(), ""), DaoUtil.toPageable(pageLink))); + .findByTenantId(tenantId.getId(), pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java index 8b11bbcef5..11805a3109 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/queue/QueueRepository.java @@ -33,7 +33,7 @@ public interface QueueRepository extends JpaRepository { List findByTenantId(UUID tenantId); @Query("SELECT q FROM QueueEntity q WHERE q.tenantId = :tenantId " + - "AND LOWER(q.name) LIKE LOWER(CONCAT(:textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(q.name, CONCAT(:textSearch, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java index 9b6ef62501..641fda927b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/JpaTbResourceDao.java @@ -74,7 +74,7 @@ public class JpaTbResourceDao extends JpaAbstractDao { @Query("SELECT tr FROM TbResourceInfoEntity tr WHERE " + - "LOWER(tr.title) LIKE LOWER(CONCAT('%', :searchText, '%'))" + + "(:searchText IS NULL OR ilike(tr.title, CONCAT('%', :searchText, '%')) = true) " + "AND (tr.tenantId = :tenantId " + "OR (tr.tenantId = :systemAdminId " + "AND NOT EXISTS " + @@ -45,7 +45,7 @@ public interface TbResourceInfoRepository extends JpaRepository findTenantResourcesByTenantId(@Param("tenantId") UUID tenantId, @Param("resourceType") String resourceType, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java index 54494673a1..3a881f5206 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceRepository.java @@ -33,7 +33,7 @@ public interface TbResourceRepository extends JpaRepository return DaoUtil.toPageData(ruleChainRepository .findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -72,7 +72,7 @@ public class JpaRuleChainDao extends JpaAbstractDao .findByTenantIdAndType( tenantId, type, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -89,7 +89,7 @@ public class JpaRuleChainDao extends JpaAbstractDao .findByTenantIdAndEdgeId( tenantId, edgeId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -99,7 +99,7 @@ public class JpaRuleChainDao extends JpaAbstractDao return DaoUtil.toPageData(ruleChainRepository .findAutoAssignByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java index 8cc57c62ce..4b6b5a0db7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleChainRepository.java @@ -30,14 +30,14 @@ import java.util.UUID; public interface RuleChainRepository extends JpaRepository, ExportableEntityRepository { @Query("SELECT rc FROM RuleChainEntity rc WHERE rc.tenantId = :tenantId " + - "AND LOWER(rc.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(rc.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT rc FROM RuleChainEntity rc WHERE rc.tenantId = :tenantId " + "AND rc.type = :type " + - "AND LOWER(rc.name) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(rc.name, CONCAT('%', :searchText, '%')) = true)") Page findByTenantIdAndType(@Param("tenantId") UUID tenantId, @Param("type") RuleChainType type, @Param("searchText") String searchText, @@ -46,7 +46,7 @@ public interface RuleChainRepository extends JpaRepository findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId, @Param("edgeId") UUID edgeId, @Param("searchText") String searchText, @@ -55,7 +55,7 @@ public interface RuleChainRepository extends JpaRepository findAutoAssignByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java index 9f01494e5c..6f0b810817 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java @@ -67,7 +67,7 @@ public class JpaTenantDao extends JpaAbstractDao implement public PageData findTenants(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(tenantRepository .findTenantsNextPage( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -75,7 +75,7 @@ public class JpaTenantDao extends JpaAbstractDao implement public PageData findTenantInfos(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData(tenantRepository .findTenantInfosNextPage( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink, TenantInfoEntity.tenantInfoColumnMap))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java index 2d65326b50..e74d2d555d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantProfileDao.java @@ -60,7 +60,7 @@ public class JpaTenantProfileDao extends JpaAbstractDao findTenantProfiles(TenantId tenantId, PageLink pageLink) { return DaoUtil.toPageData( tenantProfileRepository.findTenantProfiles( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -68,7 +68,7 @@ public class JpaTenantProfileDao extends JpaAbstractDao findTenantProfileInfos(TenantId tenantId, PageLink pageLink) { return DaoUtil.pageToPageData( tenantProfileRepository.findTenantProfileInfos( - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java index a42dc1c797..57cd8fc06f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantProfileRepository.java @@ -34,13 +34,13 @@ public interface TenantProfileRepository extends JpaRepository findTenantProfiles(@Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.common.data.EntityInfo(t.id, 'TENANT_PROFILE', t.name) " + "FROM TenantProfileEntity t " + - "WHERE LOWER(t.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "WHERE (:textSearch IS NULL OR ilike(t.name, CONCAT('%', :textSearch, '%')) = true)") Page findTenantProfileInfos(@Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java index 5174e3af83..c5340de615 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java @@ -37,14 +37,14 @@ public interface TenantRepository extends JpaRepository { "WHERE t.id = :tenantId") TenantInfoEntity findTenantInfoById(@Param("tenantId") UUID tenantId); - @Query("SELECT t FROM TenantEntity t WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + @Query("SELECT t FROM TenantEntity t WHERE (:textSearch IS NULL OR ilike(t.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantsNextPage(@Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.dao.model.sql.TenantInfoEntity(t, p.name) " + "FROM TenantEntity t " + "LEFT JOIN TenantProfileEntity p on p.id = t.tenantProfileId " + - "WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "WHERE (:textSearch IS NULL OR ilike(t.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantInfosNextPage(@Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java index e1282f7150..391981b8f4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java @@ -74,7 +74,7 @@ public class JpaUserDao extends JpaAbstractDao implements User userRepository .findByTenantId( tenantId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } @@ -85,7 +85,7 @@ public class JpaUserDao extends JpaAbstractDao implements User .findUsersByAuthority( tenantId, NULL_UUID, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), Authority.TENANT_ADMIN, DaoUtil.toPageable(pageLink))); } @@ -97,7 +97,7 @@ public class JpaUserDao extends JpaAbstractDao implements User .findUsersByAuthority( tenantId, customerId, - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), Authority.CUSTOMER_USER, DaoUtil.toPageable(pageLink))); @@ -110,7 +110,7 @@ public class JpaUserDao extends JpaAbstractDao implements User .findTenantAndCustomerUsers( tenantId, DaoUtil.toUUIDs(customerIds), - Objects.toString(pageLink.getTextSearch(), ""), + pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java index c24c66fc7c..ab7a537ec7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java @@ -37,7 +37,7 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + "AND u.customerId = :customerId AND u.authority = :authority " + - "AND LOWER(u.email) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(u.email, CONCAT('%', :searchText, '%')) = true)") Page findUsersByAuthority(@Param("tenantId") UUID tenantId, @Param("customerId") UUID customerId, @Param("searchText") String searchText, @@ -46,14 +46,14 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + "AND u.customerId IN (:customerIds) " + - "AND LOWER(u.email) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(u.email, CONCAT('%', :searchText, '%')) = true)") Page findTenantAndCustomerUsers(@Param("tenantId") UUID tenantId, @Param("customerIds") Collection customerIds, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + - "AND LOWER(u.email) LIKE LOWER(CONCAT('%', :searchText, '%'))") + "AND (:searchText IS NULL OR ilike(u.email, CONCAT('%', :searchText, '%')) = true)") Page findByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java index 0548ad814d..81515f6ca7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java @@ -83,7 +83,7 @@ public class JpaWidgetTypeDao extends JpaAbstractDao findSystemWidgetTypes(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, @Param("fullSearch") boolean fullSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId IN (:tenantId, :nullTenantId) " + - "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " + - "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))") + "AND ((:searchText IS NULL OR ilike(wtd.name, CONCAT('%', :searchText, '%')) = true) " + + "OR ((:fullSearch) IS TRUE AND ilike(wtd.description, CONCAT('%', :searchText, '%')) = true))") Page findAllTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, @Param("searchText") String searchText, @@ -55,15 +55,15 @@ public interface WidgetTypeRepository extends JpaRepository findTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, @Param("fullSearch") boolean fullSearch, Pageable pageable); @Query("SELECT wtd FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId = :tenantId " + - "AND LOWER(wtd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(wtd.name, CONCAT('%', :textSearch, '%')) = true)") Page findTenantWidgetTypeDetailsByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 7a6ba68a36..ca54fd4e62 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -33,19 +33,19 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, Pageable pageable); @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :tenantId " + - "AND LOWER(wb.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(wb.title, CONCAT('%', :textSearch, '%')) = true)") Page findTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId, @Param("textSearch") String textSearch, Pageable pageable); @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId IN (:tenantId, :nullTenantId) " + - "AND LOWER(wb.title) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (:textSearch IS NULL OR ilike(wb.title, CONCAT('%', :textSearch, '%')) = true)") Page findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, @Param("textSearch") String textSearch, diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties index 8cadda8083..05f2cf7670 100644 --- a/dao/src/test/resources/application-test.properties +++ b/dao/src/test/resources/application-test.properties @@ -139,3 +139,5 @@ queue.rule-engine.queues[2].partitions=2 queue.rule-engine.queues[2].processing-strategy.retries=1 queue.rule-engine.queues[2].processing-strategy.pause-between-retries=0 queue.rule-engine.queues[2].processing-strategy.max-pause-between-retries=0 + +spring.jpa.properties.hibernate.dialect=org.thingsboard.server.dao.ThingsboardPostgreSQLDialect \ No newline at end of file From e03e276c5a17266443a6652c723ea15db0b38399 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Mon, 9 Oct 2023 13:17:17 +0300 Subject: [PATCH 2/3] fixed sql syntax --- .../server/dao/sql/widget/WidgetsBundleRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index d185d50509..53bda50ba4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -33,7 +33,7 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId, @Param("textSearch") String textSearch, Pageable pageable); From 55b275eeef463d0ec5a9c79f5768b3c71e45d577 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 10 Oct 2023 13:07:33 +0300 Subject: [PATCH 3/3] added yml parameter description --- application/src/main/resources/thingsboard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index f9237b23e7..17d29fc214 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -690,7 +690,7 @@ spring.servlet.multipart.max-request-size: "50MB" # Total request size for a mul spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation: "true" #Fix Postgres JPA Error (Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented) spring.jpa.properties.hibernate.order_by.default_null_ordering: "${SPRING_JPA_PROPERTIES_HIBERNATE_ORDER_BY_DEFAULT_NULL_ORDERING:last}" # Note: as for current Spring JPA version, custom NullHandling for the Sort.Order is ignored and this parameter is used -spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" +spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # we use custom dialect that contains ilike(arg1, arg2) function (is interpreted to postgres ILIKE operator) # SQL DAO Configuration spring: