diff --git a/application/pom.xml b/application/pom.xml index 9364cfc16a..28716d0823 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -241,6 +241,16 @@ mockito-all test + + org.dbunit + dbunit + test + + + com.github.springtestdbunit + spring-test-dbunit + test + diff --git a/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java b/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java index b70d9522c8..2994810d7c 100644 --- a/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java +++ b/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java @@ -16,18 +16,13 @@ package org.thingsboard.server; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.SpringBootConfiguration; import org.springframework.context.annotation.ComponentScan; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.Arrays; -@EnableAutoConfiguration -@SpringBootApplication +@SpringBootConfiguration @EnableSwagger2 @ComponentScan({"org.thingsboard.server"}) public class ThingsboardServerApplication { diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 7976035059..208d9ab053 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -243,7 +243,4 @@ spring: driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}" url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}" username: "${SPRING_DATASOURCE_USERNAME:postgres}" - password: "${SPRING_DATASOURCE_PASSWORD:postgres}" -# autoconfigure: -# exclude: -# - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration \ No newline at end of file + password: "${SPRING_DATASOURCE_PASSWORD:postgres}" \ No newline at end of file diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java index 435f9a64f3..de77fe9b19 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java @@ -28,14 +28,9 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationContextLoader; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; @@ -66,11 +61,9 @@ import org.thingsboard.server.common.data.id.UUIDBased; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.config.ThingsboardSecurityConfiguration; -import org.thingsboard.server.exception.ThingsboardException; -import org.thingsboard.server.service.mail.MailService; import org.thingsboard.server.service.mail.TestMailService; -import org.thingsboard.server.service.security.auth.rest.LoginRequest; import org.thingsboard.server.service.security.auth.jwt.RefreshTokenRequest; +import org.thingsboard.server.service.security.auth.rest.LoginRequest; import java.io.IOException; import java.nio.charset.Charset; @@ -81,9 +74,7 @@ import java.util.List; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; @ActiveProfiles("test") @@ -92,7 +83,6 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppC @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:thingsboard-test.properties"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @Configuration -@EnableAutoConfiguration @ComponentScan({"org.thingsboard.server"}) @WebAppConfiguration @IntegrationTest("server.port:0") @@ -113,7 +103,6 @@ public abstract class AbstractControllerTest { MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - protected MockMvc mockMvc; protected String token; diff --git a/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java b/application/src/test/java/org/thingsboard/server/controller/CassandraControllerTestSuite.java similarity index 97% rename from application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java rename to application/src/test/java/org/thingsboard/server/controller/CassandraControllerTestSuite.java index 686e600ff6..825b2cb653 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/controller/CassandraControllerTestSuite.java @@ -26,7 +26,7 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClassnameFilters({"org.thingsboard.server.controller.*Test"}) -public class ControllerTestSuite { +public class CassandraControllerTestSuite { @ClassRule public static CustomCassandraCQLUnit cassandraUnit = @@ -35,5 +35,4 @@ public class ControllerTestSuite { new ClassPathCQLDataSet("cassandra/system-data.cql", false, false), new ClassPathCQLDataSet("system-test.cql", false, false)), "cassandra-test.yaml", 30000l); - } diff --git a/application/src/test/java/org/thingsboard/server/mqtt/AbstractFeatureIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/AbstractFeatureIntegrationTest.java index 0f449d3310..13943eab7c 100644 --- a/application/src/test/java/org/thingsboard/server/mqtt/AbstractFeatureIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/mqtt/AbstractFeatureIntegrationTest.java @@ -17,7 +17,6 @@ package org.thingsboard.server.mqtt; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationContextLoader; import org.springframework.context.annotation.ComponentScan; @@ -46,7 +45,6 @@ import static org.junit.Assert.assertNotNull; @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:thingsboard-test.properties"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @Configuration -@EnableAutoConfiguration @ComponentScan({"org.thingsboard.server"}) @WebAppConfiguration @IntegrationTest("server.port:8080") diff --git a/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java b/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java index b93ac0fc73..89f02c7545 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java +++ b/dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -28,11 +29,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; */ @Configuration @EnableAutoConfiguration -@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false) @ComponentScan("org.thingsboard.server.dao.sql") @EnableJpaRepositories("org.thingsboard.server.dao.sql") @EntityScan("org.thingsboard.server.dao.model.sql") @EnableTransactionManagement +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true") public class JpaDaoConfig { } diff --git a/dao/src/main/java/org/thingsboard/server/dao/NoSqlDaoConfig.java b/dao/src/main/java/org/thingsboard/server/dao/NoSqlDaoConfig.java new file mode 100644 index 0000000000..76cc66b5d6 --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/NoSqlDaoConfig.java @@ -0,0 +1,33 @@ +/** + * Copyright © 2016-2017 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.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableAutoConfiguration( + exclude = { + DataSourceAutoConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class, + HibernateJpaAutoConfiguration.class}) +@ConditionalOnProperty(prefix = "cassandra", value = "enabled", havingValue = "true") +public class NoSqlDaoConfig { +} diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeProjection.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeEntity.java similarity index 77% rename from dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeProjection.java rename to dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeEntity.java index c38e68f39f..3b717505cc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeProjection.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeEntity.java @@ -15,9 +15,14 @@ */ package org.thingsboard.server.dao.model.sql; -public interface TenantDeviceTypeProjection { +import lombok.AllArgsConstructor; +import lombok.Data; - String getTenantId(); +import java.util.UUID; - String getType(); +@AllArgsConstructor +@Data +public class TenantDeviceTypeEntity { + private UUID tenantId; + private String type; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java index 3e893a282e..aeaac2575d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java @@ -82,8 +82,7 @@ public abstract class JpaAbstractDao, D> implements Dao< @Override public ListenableFuture findByIdAsync(UUID key) { log.debug("Get entity by key async {}", key); - ListenableFuture listenableFuture = service.submit(() -> DaoUtil.getData(getCrudRepository().findOne(key))); - return listenableFuture; + return service.submit(() -> DaoUtil.getData(getCrudRepository().findOne(key))); } @Override 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 e46c144692..6e6ceebf7d 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 @@ -17,8 +17,8 @@ package org.thingsboard.server.dao.sql.alarm; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.common.data.alarm.Alarm; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.AlarmEntity; import java.util.UUID; @@ -27,9 +27,12 @@ import java.util.UUID; * Created by Valerii Sosliuk on 5/21/2017. */ @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) -public interface AlarmRepository extends CrudRepository { +public interface AlarmRepository extends PagingAndSortingRepository { - @Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = ?1 AND ORIGINATOR_ID = ?2 " + - "AND ?3 = ?3 AND TYPE = ?4 ORDER BY ID DESC LIMIT 1") - AlarmEntity findLatestByOriginatorAndType(UUID tenantId, UUID originatorId, int entityType, String alarmType); + @Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = :tenantId AND ORIGINATOR_ID = :originatorId " + + "AND ORIGINATOR_TYPE = :entityType AND TYPE = :alarmType ORDER BY TYPE ASC, ID DESC LIMIT 1") + AlarmEntity findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId, + @Param("originatorId") UUID originatorId, + @Param("entityType") int entityType, + @Param("alarmType") String alarmType); } 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 a88341b009..5258395036 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 @@ -15,7 +15,9 @@ */ package org.thingsboard.server.dao.sql.alarm; -import com.google.common.util.concurrent.*; +import com.google.common.util.concurrent.AsyncFunction; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -39,7 +41,6 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.concurrent.Executors; import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW; @@ -70,9 +71,12 @@ public class JpaAlarmDao extends JpaAbstractDao implements A @Override @Transactional(propagation = REQUIRES_NEW) public ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { - return service.submit(() -> DaoUtil.getData( - alarmRepository.findLatestByOriginatorAndType(tenantId.getId(), originator.getId(), - originator.getEntityType().ordinal(), type))); + return service.submit(() -> + DaoUtil.getData(alarmRepository.findLatestByOriginatorAndType( + tenantId.getId(), + originator.getId(), + originator.getEntityType().ordinal(), + type))); } @Override 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 b6c9891540..8feacf1635 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 @@ -18,12 +18,11 @@ package org.thingsboard.server.dao.sql.asset; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.common.data.asset.Asset; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.common.data.asset.TenantAssetType; import org.thingsboard.server.dao.model.sql.AssetEntity; import java.util.List; -import java.util.Optional; import java.util.UUID; /** @@ -31,28 +30,24 @@ import java.util.UUID; */ @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) public interface AssetRepository extends CrudRepository { -// - @Query(nativeQuery = true, value = "SELECT * FROM ASSET 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 ASSET 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 ASSET 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 ASSET 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 textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM ASSET 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 textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " + + "AND CUSTOMER_ID = :customerId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantIdAndCustomerId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("customerId") UUID customerId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); List findByTenantIdAndIdIn(UUID tenantId, List assetIds); @@ -60,17 +55,16 @@ public interface AssetRepository extends CrudRepository { AssetEntity findByTenantIdAndName(UUID tenantId, String name); - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID = ?3 AND TYPE = ?4 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?5, '%')) " + - "ORDER BY ID LIMIT ?1") - List findByTenantIdAndCustomerIdAndTypeFirstPage(int limit, UUID tenantId, UUID customerId, String type, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID = ?3 AND TYPE = ?4 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?5, '%')) " + - "AND ID > ?6 ORDER BY ID LIMIT ?1") - List findByTenantIdAndCustomerIdAndTypeNextPage(int limit, UUID tenantId, UUID customerId, String type, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM ASSET 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); @Query(value = "SELECT NEW org.thingsboard.server.common.data.asset.TenantAssetType(a.type, a.tenantId) FROM AssetEntity a GROUP BY a.tenantId, a.type") List findTenantAssetTypes(); 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 f7af996f18..17f2024c78 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 @@ -16,8 +16,6 @@ package org.thingsboard.server.dao.sql.asset; import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.repository.CrudRepository; @@ -33,7 +31,8 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.Executors; + +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; /** * Created by Valerii Sosliuk on 5/19/2017. @@ -57,13 +56,12 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao im @Override public List findAssetsByTenantId(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(assetRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, - pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(assetRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId, - pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(assetRepository + .findByTenantId( + pageLink.getLimit(), + tenantId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override @@ -74,19 +72,19 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao im @Override public List findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdFirstPage(pageLink.getLimit(), tenantId, - customerId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdNextPage(pageLink.getLimit(), tenantId, - customerId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(assetRepository + .findByTenantIdAndCustomerId( + pageLink.getLimit(), + tenantId, + customerId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override public ListenableFuture> findAssetsByTenantIdAndCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List assetIds) { return service.submit(() -> - DaoUtil.convertDataList( assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds))); + DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds))); } @Override @@ -102,13 +100,14 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao im @Override public List findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndTypeFirstPage(pageLink.getLimit(), tenantId, - customerId, type, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndTypeNextPage(pageLink.getLimit(), tenantId, - customerId, type, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(assetRepository + .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/component/ComponentDescriptorRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java index ee72b2dcca..266ae494d9 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 @@ -18,13 +18,9 @@ package org.thingsboard.server.dao.sql.component; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Component; -import org.thingsboard.server.common.data.plugin.ComponentScope; -import org.thingsboard.server.common.data.plugin.ComponentType; -import org.thingsboard.server.dao.model.ToData; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; -import java.util.Collection; import java.util.List; import java.util.UUID; @@ -36,25 +32,22 @@ public interface ComponentDescriptorRepository extends CrudRepository findByTypeFirstPage(int limit, String type, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findByTypeNextPage(int limit, String type, String textSearch, UUID idOffset); - - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + - "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + - "ORDER BY ID LIMIT ?1") - List findByScopeAndTypeFirstPage(int limit, String type, String scope, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + - "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + - "AND ID > ?5 ORDER BY ID LIMIT ?1") - List findByScopeAndTypeNextPage(int limit, String type, String scope, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByType(@Param("limit") int limit, + @Param("type") String type, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " + + "AND SCOPE = :scope AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByScopeAndType(@Param("limit") int limit, + @Param("type") String type, + @Param("scope") String scope, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); void deleteByClazz(String clazz); } 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 c94e042488..405af2ad64 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 @@ -34,13 +34,15 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; + /** * Created by Valerii Sosliuk on 5/6/2017. */ @Component @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao - implements ComponentDescriptorDao { + implements ComponentDescriptorDao { @Autowired private ComponentDescriptorRepository componentDescriptorRepository; @@ -79,24 +81,23 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeFirstPage(pageLink.getLimit(), - type.toString(), pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeNextPage(pageLink.getLimit(), - type.toString(), pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(componentDescriptorRepository + .findByType( + pageLink.getLimit(), + type.toString(), + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override public List findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeFirstPage(pageLink.getLimit(), - type.toString(), scope.toString(), pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeNextPage(pageLink.getLimit(), - type.toString(), scope.toString(), pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(componentDescriptorRepository + .findByScopeAndType( + pageLink.getLimit(), + type.toString(), + scope.toString(), + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java index 83e2dba9be..3ce55c008f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java @@ -18,7 +18,7 @@ package org.thingsboard.server.dao.sql.customer; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.common.data.Customer; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.CustomerEntity; import java.util.List; @@ -30,15 +30,13 @@ import java.util.UUID; @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) public interface CustomerRepository extends CrudRepository { - @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER 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 CUSTOMER 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 CUSTOMER 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); CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title); 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 41fd310176..a50526611c 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 @@ -23,7 +23,6 @@ import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.customer.CustomerDao; -import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.sql.CustomerEntity; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; @@ -31,12 +30,14 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; + /** * Created by Valerii Sosliuk on 5/6/2017. */ @Component @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) -public class JpaCustomerDao extends JpaAbstractSearchTextDao implements CustomerDao{ +public class JpaCustomerDao extends JpaAbstractSearchTextDao implements CustomerDao { @Autowired private CustomerRepository customerRepository; @@ -53,12 +54,8 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(customerRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(customerRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId, - pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(customerRepository.findByTenantId(pageLink.getLimit(), tenantId, + pageLink.getTextSearch(), pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override 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 868ec5e3a0..729e6980a9 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 @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.dashboard; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.DashboardInfoEntity; import java.util.List; @@ -29,23 +30,20 @@ import java.util.UUID; @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) public interface DashboardInfoRepository extends CrudRepository { - @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD 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 DASHBOARD 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 DASHBOARD 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 DASHBOARD 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 textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD 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 textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " + + "AND CUSTOMER_ID = :customerId AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit?1") + List findByTenantIdAndCustomerId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("customerId") UUID customerId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); } 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 81f73092d5..77401c64c8 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 @@ -29,7 +29,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import java.util.List; import java.util.UUID; -import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; /** * Created by Valerii Sosliuk on 5/6/2017. @@ -53,23 +53,22 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdFirstPage( - pageLink.getLimit(), tenantId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdNextPage( - pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(dashboardInfoRepository + .findByTenantId( + pageLink.getLimit(), + tenantId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override public List findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdFirstPage( - pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdNextPage( - pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(dashboardInfoRepository + .findByTenantIdAndCustomerId( + pageLink.getLimit(), + tenantId, + customerId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } } 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 343efc43dc..0386aa86fc 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 @@ -19,11 +19,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; import org.thingsboard.server.dao.model.sql.DeviceEntity; -import org.thingsboard.server.dao.model.sql.TenantDeviceTypeProjection; +import org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity; -import java.util.Collection; import java.util.List; import java.util.UUID; @@ -74,12 +72,8 @@ public interface DeviceRepository extends CrudRepository { @Param("textSearch") String textSearch, @Param("idOffset") UUID idOffset); - // TODO: CAST was used because in other case when you try convert directly UUID field to UUID java object error throwed: - // org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 - // I suppose that Spring Projection doesn't support correct mapping for this type of column - // and only Entity at the moment supports UUID - @Query(value = "SELECT DISTINCT CAST(TENANT_ID as VARCHAR) as tenantId, TYPE as type FROM DEVICE", nativeQuery = true) - List findTenantDeviceTypes(); + @Query(value = "SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d") + List findTenantDeviceTypes(); DeviceEntity findByTenantIdAndName(UUID tenantId, String name); 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 5904183f0d..455075c945 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 @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.device.DeviceDao; import org.thingsboard.server.dao.model.sql.DeviceEntity; -import org.thingsboard.server.dao.model.sql.TenantDeviceTypeProjection; +import org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import java.util.*; @@ -121,15 +121,15 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao @Override public ListenableFuture> findTenantDeviceTypesAsync() { - return service.submit(() -> convertTenantDeviceTypeToDto(deviceRepository.findTenantDeviceTypes())); + return service.submit(() -> convertTenantDeviceTypeEntityToDto(deviceRepository.findTenantDeviceTypes())); } - private List convertTenantDeviceTypeToDto(List resultSet) { + private List convertTenantDeviceTypeEntityToDto(List entities) { List list = Collections.emptyList(); - if (resultSet != null && !resultSet.isEmpty()) { + if (entities != null && !entities.isEmpty()) { list = new ArrayList<>(); - for (TenantDeviceTypeProjection object : resultSet) { - list.add(new TenantDeviceType(object.getType(), new TenantId(UUID.fromString(object.getTenantId())))); + for (TenantDeviceTypeEntity entity : entities) { + list.add(new TenantDeviceType(entity.getType(), new TenantId(entity.getTenantId()))); } } return list; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java index b0d9a712e7..82ccc62bc7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java @@ -17,14 +17,10 @@ package org.thingsboard.server.dao.sql.event; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.springframework.data.repository.query.Param; import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.Event; import org.thingsboard.server.dao.model.sql.EventEntity; -import java.util.List; import java.util.UUID; /** diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java index b4ad114a41..0463200241 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java @@ -25,16 +25,16 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.plugin.PluginMetaData; import org.thingsboard.server.dao.DaoUtil; -import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.sql.PluginMetaDataEntity; import org.thingsboard.server.dao.plugin.PluginDao; -import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import java.util.Arrays; import java.util.List; import java.util.UUID; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; + /** * Created by Valerii Sosliuk on 5/1/2017. */ @@ -93,15 +93,13 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) { - log.debug("Try to find здгпшты by tenantId [{}] and pageLink [{}]", tenantId, pageLink); - List entities; - if (pageLink.getIdOffset() == null) { - entities = pluginMetaDataRepository - .findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch()); - } else { - entities = pluginMetaDataRepository - .findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset()); - } + log.debug("Try to find plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink); + List entities = pluginMetaDataRepository + .findByTenantIdAndPageLink( + pageLink.getLimit(), + tenantId.getId(), + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()); if (log.isTraceEnabled()) { log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); } else { @@ -113,14 +111,13 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) { log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink); - List entities; - if (pageLink.getIdOffset() == null) { - entities = pluginMetaDataRepository - .findAllTenantPluginsByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch()); - } else { - entities = pluginMetaDataRepository - .findAllTenantPluginsByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()); - } + List entities = pluginMetaDataRepository + .findAllTenantPluginsByTenantId( + pageLink.getLimit(), + tenantId, + NULL_UUID, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()); if (log.isTraceEnabled()) { log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java index 315042b6c9..b21bfae1d1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java @@ -18,9 +18,8 @@ package org.thingsboard.server.dao.sql.plugin; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.common.data.plugin.PluginMetaData; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.PluginMetaDataEntity; -import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity; import java.util.List; import java.util.UUID; @@ -33,23 +32,20 @@ public interface PluginMetaDataRepository extends CrudRepository findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); - - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findAllTenantPluginsByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findAllTenantPluginsByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = :tenantId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantIdAndPageLink(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID IN (:tenantId, :nullTenantId) " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findAllTenantPluginsByTenantId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("nullTenantId") UUID nullTenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java index 5914257062..169612cfa1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java @@ -21,7 +21,6 @@ import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.EntityId; @@ -32,10 +31,8 @@ import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.model.sql.RelationCompositeKey; import org.thingsboard.server.dao.model.sql.RelationEntity; import org.thingsboard.server.dao.relation.RelationDao; -import org.thingsboard.server.dao.sql.JpaAbstractDao; import java.util.List; -import java.util.UUID; import java.util.concurrent.Executors; /** @@ -111,8 +108,9 @@ public class JpaRelationDao implements RelationDao { RelationCompositeKey key = new RelationCompositeKey(relation); return executorService.submit( () -> { + boolean relationExistsBeforeDelete = relationRepository.exists(key); relationRepository.delete(key); - return !relationRepository.exists(key); + return relationExistsBeforeDelete; }); } @@ -127,9 +125,9 @@ public class JpaRelationDao implements RelationDao { typeGroup.name()); return executorService.submit( () -> { - boolean result = relationRepository.exists(key); + boolean relationExistsBeforeDelete = relationRepository.exists(key); relationRepository.delete(key); - return result; + return relationExistsBeforeDelete; }); } @@ -141,16 +139,17 @@ public class JpaRelationDao implements RelationDao { return executorService.submit( () -> { - boolean result = relationRepository + boolean relationExistsBeforeDelete = relationRepository .findAllByFromIdAndFromType(relationEntity.getFromId(), relationEntity.getFromType()) .size() > 0; relationRepository.delete(relationEntity); - return result; + return relationExistsBeforeDelete; }); } @Override public ListenableFuture> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) { +// TODO: // executorService.submit(() -> DaoUtil.convertDataList( // relationRepository.findRelations( // to.getId(), diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java index 5c8921a02c..68243d5aa5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java @@ -15,29 +15,14 @@ */ package org.thingsboard.server.dao.sql.relation; -import com.datastax.driver.core.querybuilder.QueryBuilder; -import com.datastax.driver.core.querybuilder.Select; -import com.google.common.util.concurrent.ListenableFuture; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.springframework.data.repository.query.Param; -import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.id.EntityId; -import org.thingsboard.server.common.data.page.TimePageLink; -import org.thingsboard.server.common.data.relation.EntityRelation; -import org.thingsboard.server.common.data.relation.RelationTypeGroup; -import org.thingsboard.server.dao.CassandraAbstractSearchTimeDao; -import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.sql.RelationCompositeKey; import org.thingsboard.server.dao.model.sql.RelationEntity; -import java.util.Arrays; import java.util.List; import java.util.UUID; -import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; - @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true") public interface RelationRepository extends CrudRepository { @@ -62,46 +47,19 @@ public interface RelationRepository extends CrudRepository findAllByFromIdAndFromType(UUID fromId, String fromType); - @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 findRelations(@Param("fromId") UUID fromId, - @Param("fromType") String fromType, - @Param("toType") String toType, - @Param("relationType") String relationType, - @Param("relationTypeGroup") String relationTypeGroup, - TimePageLink pageLink); +// @Query(nativeQuery = true, value = "SELECT * FROM RELATION WHERE FROM_ID = :fromId " + +// "AND FROM_TYPE = :fromType " + +// "AND TO_TYPE = :toType " + +// "AND RELATION_TYPE = :relationType " + +// "AND RELATION_TYPE_GROUP = :relationTypeGroup " + +// "AND ID > :idOffset ORDER BY RELATION_TYPE_GROUP ASC, RELATION_TYPE ASC, TO_TYPE ASC") +// List findRelations(@Param("fromId") UUID fromId, +// @Param("fromType") String fromType, +// @Param("toType") String toType, +// @Param("relationType") String relationType, +// @Param("relationTypeGroup") String relationTypeGroup, +// TimePageLink pageLink); -// Select.Where query = CassandraAbstractSearchTimeDao.buildQuery(ModelConstants.RELATION_BY_TYPE_AND_CHILD_TYPE_VIEW_NAME, -// Arrays.asList(eq(ModelConstants.RELATION_FROM_ID_PROPERTY, from.getId()), -// eq(ModelConstants.RELATION_FROM_TYPE_PROPERTY, from.getEntityType().name()), -// eq(ModelConstants.RELATION_TYPE_GROUP_PROPERTY, typeGroup.name()), -// eq(ModelConstants.RELATION_TYPE_PROPERTY, relationType), -// eq(ModelConstants.RELATION_TO_TYPE_PROPERTY, childType.name())), -// Arrays.asList(QueryBuilder.asc(ModelConstants.RELATION_TYPE_GROUP_PROPERTY), -// QueryBuilder.asc(ModelConstants.RELATION_TYPE_PROPERTY), -// QueryBuilder.asc(ModelConstants.RELATION_TO_TYPE_PROPERTY)), // pageLink, ModelConstants.RELATION_TO_ID_PROPERTY); } - -// private UUID fromId; -// private String fromType; -// private UUID toId; -// private String toType; -// private String relationTypeGroup; -// private String relationType; -// -// -// ListenableFuture checkRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup); -// -// ListenableFuture saveRelation(EntityRelation relation); -// -// ListenableFuture deleteRelation(EntityRelation relation); -// -// ListenableFuture deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup); -// -// ListenableFuture deleteOutboundRelations(EntityId entity); -// -// ListenableFuture> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType toType, TimePageLink pageLink); \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java index b5e6bf556d..b1f53a93b7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java @@ -25,16 +25,16 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.rule.RuleMetaData; import org.thingsboard.server.dao.DaoUtil; -import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity; import org.thingsboard.server.dao.rule.RuleDao; -import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import java.util.Arrays; import java.util.List; import java.util.UUID; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; + /** * Created by Valerii Sosliuk on 4/30/2017. */ @@ -70,14 +70,13 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) { log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink); - List entities; - if (pageLink.getIdOffset() == null) { - entities = ruleMetaDataRepository - .findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch()); - } else { - entities = ruleMetaDataRepository - .findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset()); - } + List entities = + ruleMetaDataRepository + .findByTenantIdAndPageLink( + pageLink.getLimit(), + tenantId.getId(), + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()); if (log.isTraceEnabled()) { log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); } else { @@ -89,14 +88,15 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) { log.debug("Try to find all tenant rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink); - List entities; - if (pageLink.getIdOffset() == null) { - entities = ruleMetaDataRepository - .findAllTenantRulesByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch()); - } else { - entities = ruleMetaDataRepository - .findAllTenantRulesByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()); - } + List entities = + ruleMetaDataRepository + .findAllTenantRulesByTenantId( + pageLink.getLimit(), + tenantId, + NULL_UUID, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()); + if (log.isTraceEnabled()) { log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); } else { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java index 1a3b1439ce..0bf6742672 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java @@ -18,11 +18,9 @@ package org.thingsboard.server.dao.sql.rule; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.model.ToData; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity; -import java.util.Collection; import java.util.List; import java.util.UUID; @@ -34,23 +32,20 @@ public interface RuleMetaDataRepository extends CrudRepository findByPluginToken(String pluginToken); - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); - - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findAllTenantRulesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findAllTenantRulesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = :tenantId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByTenantIdAndPageLink(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findAllTenantRulesByTenantId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("nullTenantId") UUID nullTenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java index 5862c359b6..2aa26a2daa 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java @@ -16,7 +16,6 @@ package org.thingsboard.server.dao.sql.settings; import org.springframework.data.repository.CrudRepository; -import org.thingsboard.server.dao.model.ToData; import org.thingsboard.server.dao.model.sql.AdminSettingsEntity; import java.util.UUID; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java index 10dab03e57..e31c5d0569 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java @@ -28,8 +28,6 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao; import java.util.UUID; -import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME; - @Component @Slf4j @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true") 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 f2feef25f5..e434431ec3 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 @@ -23,14 +23,13 @@ import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.model.sql.TenantEntity; -import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import org.thingsboard.server.dao.tenant.TenantDao; import java.util.List; import java.util.UUID; -import static org.thingsboard.server.dao.model.ModelConstants.TENANT_COLUMN_FAMILY_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; /** * Created by Valerii Sosliuk on 4/30/2017. @@ -54,10 +53,11 @@ public class JpaTenantDao extends JpaAbstractSearchTextDao @Override public List findTenantsByRegion(String region, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(tenantRepository.findByRegionFirstPage(pageLink.getLimit(), region, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(tenantRepository.findByRegionNextPage(pageLink.getLimit(), region, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList(tenantRepository + .findByRegionNextPage( + pageLink.getLimit(), + region, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } } 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 6c94072305..8c6a9546c3 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 @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.tenant; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.TenantEntity; import java.util.List; @@ -29,15 +30,11 @@ import java.util.UUID; @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) public interface TenantRepository extends CrudRepository { - - @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findByRegionFirstPage(int limit, String region, String textSearch); - - - @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findByRegionNextPage(int limit, String region, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = :region " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findByRegionNextPage(@Param("limit") int limit, + @Param("region") String region, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); } 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 1a3c6eaf2d..ec1e6740e3 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 @@ -22,7 +22,6 @@ import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.dao.DaoUtil; -import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.sql.UserEntity; import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.user.UserDao; @@ -30,6 +29,8 @@ import org.thingsboard.server.dao.user.UserDao; import java.util.List; import java.util.UUID; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; + /** * @author Valerii Sosliuk */ @@ -57,20 +58,22 @@ public class JpaUserDao extends JpaAbstractDao implements User @Override public List findTenantAdmins(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(userRepository.findTenantAdminsFirstPage(pageLink.getLimit(), tenantId)); - } else { - return DaoUtil.convertDataList(userRepository.findTenantAdminsNextPage(pageLink.getLimit(), tenantId, pageLink.getIdOffset())); - } + return DaoUtil.convertDataList( + userRepository + .findTenantAdmins( + pageLink.getLimit(), + tenantId, + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override public List findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(userRepository.findCustomerUsersFirstPage(pageLink.getLimit(), tenantId, customerId)); - } else { - return DaoUtil.convertDataList(userRepository.findCustomerUsersNextPage(pageLink.getLimit(), tenantId, - customerId, pageLink.getIdOffset())); - } + return DaoUtil.convertDataList( + userRepository + .findCustomerUsers( + pageLink.getLimit(), + tenantId, + customerId, + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } } 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 b7d3aa7016..f9d280249c 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 @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.user; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.UserEntity; import java.util.List; @@ -31,24 +32,19 @@ public interface UserRepository extends CrudRepository { UserEntity findByEmail(String email); - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " + + @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " + "AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " + - "ORDER BY ID LIMIT ?1") - List findTenantAdminsFirstPage(int limit, UUID tenantId); - - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " + - "AND ID > ?3 ORDER BY ID LIMIT ?1") - List findTenantAdminsNextPage(int limit, UUID tenantId, UUID idOffset); - - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID = ?3 AND AUTHORITY = 'CUSTOMER_USER' " + - "ORDER BY ID LIMIT ?1") - List findCustomerUsersFirstPage(int limit, UUID tenantId, UUID customerId); - - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " + - "AND CUSTOMER_ID = ?3 AND AUTHORITY = 'CUSTOMER_USER' " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findCustomerUsersNextPage(int limit, UUID tenantId, UUID customerId, UUID idOffset); + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findTenantAdmins(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " + + "AND CUSTOMER_ID = :customerId AND AUTHORITY = 'CUSTOMER_USER' " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findCustomerUsers(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("customerId") UUID customerId, + @Param("idOffset") UUID idOffset); } \ No newline at end of file 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 fab9955d97..670bd7fc8f 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 @@ -58,34 +58,35 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao findSystemWidgetsBundles(TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit(), - pageLink.getTextSearch(), NULL_UUID)); - } else { - return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit(), - pageLink.getTextSearch(), pageLink.getIdOffset(), NULL_UUID)); - } + return DaoUtil.convertDataList( + widgetsBundleRepository + .findSystemWidgetsBundles( + pageLink.getLimit(), + NULL_UUID, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override public List findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(), - tenantId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(), - tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList( + widgetsBundleRepository + .findTenantWidgetsBundlesByTenantId( + pageLink.getLimit(), + tenantId, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } @Override public List findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { - if (pageLink.getIdOffset() == null) { - return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(), - tenantId, pageLink.getTextSearch())); - } else { - return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(), - tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); - } + return DaoUtil.convertDataList( + widgetsBundleRepository + .findAllTenantWidgetsBundlesByTenantId( + pageLink.getLimit(), + tenantId, + NULL_UUID, + pageLink.getTextSearch(), + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); } } 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 9341a841ee..1998a55cda 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 @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.widget; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; import java.util.List; @@ -31,33 +32,28 @@ public interface WidgetsBundleRepository extends CrudRepository findSystemWidgetsBundlesFirstPage(Integer limit, String searchText, UUID tenantId); - - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?4 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " + - "AND ID > ?3 ORDER BY ID LIMIT ?1") - List findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset, UUID tenantId); - - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); - - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "ORDER BY ID LIMIT ?1") - List findAllTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); - - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " + - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + - "AND ID > ?4 ORDER BY ID LIMIT ?1") - List findAllTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :systemTenantId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findSystemWidgetsBundles(@Param("limit") int limit, + @Param("systemTenantId") UUID systemTenantId, + @Param("searchText") String searchText, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :tenantId " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findTenantWidgetsBundlesByTenantId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); + + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " + + "AND ID > :idOffset ORDER BY ID LIMIT :limit") + List findAllTenantWidgetsBundlesByTenantId(@Param("limit") int limit, + @Param("tenantId") UUID tenantId, + @Param("nullTenantId") UUID nullTenantId, + @Param("textSearch") String textSearch, + @Param("idOffset") UUID idOffset); } diff --git a/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java index f6b6b7353b..c8e715fdaa 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java @@ -32,7 +32,8 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {JpaDaoConfig.class, JpaDbunitTestConfig.class}) @TestPropertySource("classpath:jpa-test.properties") -@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, +@TestExecutionListeners({ + DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, DbUnitTestExecutionListener.class }) @DbUnitConfiguration(databaseConnection = "dbUnitDatabaseConnection") diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java index 95340e6b76..a73ee52424 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.test.annotation.DirtiesContext; @@ -68,7 +67,6 @@ import java.util.concurrent.ThreadLocalRandom; @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:application-test.properties"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @Configuration -@EnableAutoConfiguration @ComponentScan("org.thingsboard.server") public abstract class AbstractServiceTest { diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java index b26db0bb97..ad0c9cf602 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java @@ -15,8 +15,6 @@ */ package org.thingsboard.server.dao.sql.alarm; -import com.datastax.driver.core.utils.UUIDs; -import com.github.springtestdbunit.annotation.DatabaseSetup; import com.google.common.util.concurrent.ListenableFuture; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +23,6 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmId; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.id.DeviceId; -import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.AbstractJpaDaoTest; import org.thingsboard.server.dao.alarm.AlarmDao;