diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java b/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java index 23b3fc9a99..28d97cb933 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java @@ -121,7 +121,7 @@ public class CassandraDeviceDao extends CassandraAbstractSearchTextDao findDevicesByTenantIdAndName(UUID tenantId, String deviceName) { + public Optional findDeviceByTenantIdAndName(UUID tenantId, String deviceName) { Select select = select().from(DEVICE_BY_TENANT_AND_NAME_VIEW_NAME); Select.Where query = select.where(); query.and(eq(DEVICE_TENANT_ID_PROPERTY, tenantId)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java index 3654ca393e..d928a9a12c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceDao.java @@ -107,7 +107,7 @@ public interface DeviceDao extends Dao { * @param name the device name * @return the optional device object */ - Optional findDevicesByTenantIdAndName(UUID tenantId, String name); + Optional findDeviceByTenantIdAndName(UUID tenantId, String name); /** * Find tenants device types. diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java index b06faa17c1..458d30a8b3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java @@ -37,7 +37,6 @@ import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.entity.AbstractEntityService; import org.thingsboard.server.dao.exception.DataValidationException; -import org.thingsboard.server.dao.model.TenantDeviceTypeEntity; import org.thingsboard.server.dao.relation.EntitySearchDirection; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; @@ -88,7 +87,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe public Optional findDeviceByTenantIdAndName(TenantId tenantId, String name) { log.trace("Executing findDeviceByTenantIdAndName [{}][{}]", tenantId, name); validateId(tenantId, "Incorrect tenantId " + tenantId); - Optional deviceOpt = deviceDao.findDevicesByTenantIdAndName(tenantId.getId(), name); + Optional deviceOpt = deviceDao.findDeviceByTenantIdAndName(tenantId.getId(), name); if (deviceOpt.isPresent()) { return Optional.of(deviceOpt.get()); } else { @@ -261,7 +260,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe @Override protected void validateCreate(Device device) { - deviceDao.findDevicesByTenantIdAndName(device.getTenantId().getId(), device.getName()).ifPresent( + deviceDao.findDeviceByTenantIdAndName(device.getTenantId().getId(), device.getName()).ifPresent( d -> { throw new DataValidationException("Device with such name already exists!"); } @@ -270,7 +269,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe @Override protected void validateUpdate(Device device) { - deviceDao.findDevicesByTenantIdAndName(device.getTenantId().getId(), device.getName()).ifPresent( + deviceDao.findDeviceByTenantIdAndName(device.getTenantId().getId(), device.getName()).ifPresent( d -> { if (!d.getUuidId().equals(device.getUuidId())) { throw new DataValidationException("Device with such name already exists!"); 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 ea3e92e7a8..5a43f8e9c9 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 @@ -5,7 +5,7 @@ * 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 + * 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, @@ -18,8 +18,7 @@ package org.thingsboard.server.dao.sql.device; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.springframework.scheduling.annotation.Async; -import org.springframework.util.concurrent.ListenableFuture; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.DeviceEntity; import java.util.List; @@ -31,32 +30,52 @@ import java.util.UUID; @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) public interface DeviceRepository extends CrudRepository { - @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID = ?3 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + - "ORDER BY ID LIMIT ?1") - List findByTenantIdAndCustomerIdFirstPage(int limit, UUID tenantId, UUID customerId, String searchText); - @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID = ?3 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + - "AND ID > ?5 ORDER BY ID LIMIT ?1") - List findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String searchText, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " + + "AND CUSTOMER_ID = :customerId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantIdAndCustomerId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("customerId") UUID customerId, + @Param("searchText") String searchText, + @Param("idOffset") UUID idOffset); - @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); + @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); - @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " + + "AND TYPE = :type " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantIdAndType(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("type") String type, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " + + "AND CUSTOMER_ID = :customerId " + + "AND TYPE = :type " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantIdAndCustomerIdAndType(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("customerId") UUID customerId, + @Param("type") String type, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); DeviceEntity findByTenantIdAndName(UUID tenantId, String name); List findDevicesByTenantIdAndCustomerIdAndIdIn(UUID tenantId, UUID customerId, List deviceIds); List findDevicesByTenantId(UUID tenantId); + List findDevicesByTenantIdAndIdIn(UUID tenantId, List deviceIds); } 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 6790c7a51f..665be77eb8 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 @@ -5,7 +5,7 @@ * 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 + * 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, @@ -35,7 +35,7 @@ import java.util.Optional; import java.util.UUID; import java.util.concurrent.Executors; -import static org.thingsboard.server.dao.model.ModelConstants.DEVICE_COLUMN_FAMILY_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; /** * Created by Valerii Sosliuk on 5/6/2017. @@ -59,13 +59,13 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao @Override public List findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(deviceRepository.findByTenantIdFirstPage( - pageLink.getLimit(), tenantId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(deviceRepository.findByTenantIdNextPage( - pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList( + deviceRepository.findByTenantId( + pageLink.getLimit(), + tenantId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()) + ); } @Override @@ -77,13 +77,14 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao @Override public List findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(deviceRepository.findByTenantIdAndCustomerIdFirstPage(pageLink.getLimit(), - tenantId, customerId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(deviceRepository.findByTenantIdAndCustomerIdNextPage(pageLink.getLimit(), - tenantId, customerId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList( + deviceRepository.findByTenantIdAndCustomerId( + pageLink.getLimit(), + tenantId, + customerId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()) + ); } @Override @@ -94,22 +95,34 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao } @Override - // Probably findDevice, not findDevices? - public Optional findDevicesByTenantIdAndName(UUID tenantId, String name) { + public Optional findDeviceByTenantIdAndName(UUID tenantId, String name) { Device device = DaoUtil.getData(deviceRepository.findByTenantIdAndName(tenantId, name)); return Optional.ofNullable(device); } @Override public List findDevicesByTenantIdAndType(UUID tenantId, String type, TextPageLink pageLink) { - //TODO - return null; + return DaoUtil.convertDataList( + deviceRepository.findByTenantIdAndType( + pageLink.getLimit(), + tenantId, + type, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()) + ); } @Override public List findDevicesByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) { - //TODO - return null; + return DaoUtil.convertDataList( + deviceRepository.findByTenantIdAndCustomerIdAndType( + pageLink.getLimit(), + tenantId, + customerId, + type, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()) + ); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java index 126fb86f99..fab9955d97 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java @@ -56,7 +56,6 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao findSystemWidgetsBundles(TextPageLink pageLink) { if (pageLink.getIdOffset() == null) {