Commit 3534684588523b3d3a77d7bd697cc20520963d45

Authored by Volodymyr Babak
1 parent 77673751

Refactored first and next dao methods

Fixed NULL_UUID
Added support for running cassandra and postgres application versions
Showing 40 changed files with 394 additions and 461 deletions
... ... @@ -241,6 +241,16 @@
241 241 <artifactId>mockito-all</artifactId>
242 242 <scope>test</scope>
243 243 </dependency>
  244 + <dependency>
  245 + <groupId>org.dbunit</groupId>
  246 + <artifactId>dbunit</artifactId>
  247 + <scope>test</scope>
  248 + </dependency>
  249 + <dependency>
  250 + <groupId>com.github.springtestdbunit</groupId>
  251 + <artifactId>spring-test-dbunit</artifactId>
  252 + <scope>test</scope>
  253 + </dependency>
244 254 </dependencies>
245 255
246 256 <build>
... ...
... ... @@ -16,18 +16,13 @@
16 16 package org.thingsboard.server;
17 17
18 18 import org.springframework.boot.SpringApplication;
19   -import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
20   -import org.springframework.boot.autoconfigure.SpringBootApplication;
21   -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
22   -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
23   -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
  19 +import org.springframework.boot.SpringBootConfiguration;
24 20 import org.springframework.context.annotation.ComponentScan;
25 21 import springfox.documentation.swagger2.annotations.EnableSwagger2;
26 22
27 23 import java.util.Arrays;
28 24
29   -@EnableAutoConfiguration
30   -@SpringBootApplication
  25 +@SpringBootConfiguration
31 26 @EnableSwagger2
32 27 @ComponentScan({"org.thingsboard.server"})
33 28 public class ThingsboardServerApplication {
... ...
... ... @@ -243,7 +243,4 @@ spring:
243 243 driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
244 244 url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}"
245 245 username: "${SPRING_DATASOURCE_USERNAME:postgres}"
246   - password: "${SPRING_DATASOURCE_PASSWORD:postgres}"
247   -# autoconfigure:
248   -# exclude:
249   -# - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
\ No newline at end of file
  246 + password: "${SPRING_DATASOURCE_PASSWORD:postgres}"
\ No newline at end of file
... ...
... ... @@ -28,14 +28,9 @@ import org.junit.After;
28 28 import org.junit.Assert;
29 29 import org.junit.Before;
30 30 import org.junit.runner.RunWith;
31   -import org.mockito.Mockito;
32   -import org.mockito.invocation.InvocationOnMock;
33   -import org.mockito.stubbing.Answer;
34 31 import org.springframework.beans.factory.annotation.Autowired;
35   -import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
36 32 import org.springframework.boot.test.IntegrationTest;
37 33 import org.springframework.boot.test.SpringApplicationContextLoader;
38   -import org.springframework.context.annotation.Bean;
39 34 import org.springframework.context.annotation.ComponentScan;
40 35 import org.springframework.context.annotation.Configuration;
41 36 import org.springframework.http.HttpHeaders;
... ... @@ -66,11 +61,9 @@ import org.thingsboard.server.common.data.id.UUIDBased;
66 61 import org.thingsboard.server.common.data.page.TextPageLink;
67 62 import org.thingsboard.server.common.data.security.Authority;
68 63 import org.thingsboard.server.config.ThingsboardSecurityConfiguration;
69   -import org.thingsboard.server.exception.ThingsboardException;
70   -import org.thingsboard.server.service.mail.MailService;
71 64 import org.thingsboard.server.service.mail.TestMailService;
72   -import org.thingsboard.server.service.security.auth.rest.LoginRequest;
73 65 import org.thingsboard.server.service.security.auth.jwt.RefreshTokenRequest;
  66 +import org.thingsboard.server.service.security.auth.rest.LoginRequest;
74 67
75 68 import java.io.IOException;
76 69 import java.nio.charset.Charset;
... ... @@ -81,9 +74,7 @@ import java.util.List;
81 74
82 75 import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
83 76 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
84   -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
85   -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
86   -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  77 +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
87 78 import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
88 79
89 80 @ActiveProfiles("test")
... ... @@ -92,7 +83,6 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppC
92 83 @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:thingsboard-test.properties"})
93 84 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
94 85 @Configuration
95   -@EnableAutoConfiguration
96 86 @ComponentScan({"org.thingsboard.server"})
97 87 @WebAppConfiguration
98 88 @IntegrationTest("server.port:0")
... ... @@ -113,7 +103,6 @@ public abstract class AbstractControllerTest {
113 103 MediaType.APPLICATION_JSON.getSubtype(),
114 104 Charset.forName("utf8"));
115 105
116   -
117 106 protected MockMvc mockMvc;
118 107
119 108 protected String token;
... ...
application/src/test/java/org/thingsboard/server/controller/CassandraControllerTestSuite.java renamed from application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java
... ... @@ -26,7 +26,7 @@ import java.util.Arrays;
26 26
27 27 @RunWith(ClasspathSuite.class)
28 28 @ClassnameFilters({"org.thingsboard.server.controller.*Test"})
29   -public class ControllerTestSuite {
  29 +public class CassandraControllerTestSuite {
30 30
31 31 @ClassRule
32 32 public static CustomCassandraCQLUnit cassandraUnit =
... ... @@ -35,5 +35,4 @@ public class ControllerTestSuite {
35 35 new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
36 36 new ClassPathCQLDataSet("system-test.cql", false, false)),
37 37 "cassandra-test.yaml", 30000l);
38   -
39 38 }
... ...
... ... @@ -17,7 +17,6 @@ package org.thingsboard.server.mqtt;
17 17
18 18 import org.junit.runner.RunWith;
19 19 import org.springframework.beans.factory.annotation.Autowired;
20   -import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
21 20 import org.springframework.boot.test.IntegrationTest;
22 21 import org.springframework.boot.test.SpringApplicationContextLoader;
23 22 import org.springframework.context.annotation.ComponentScan;
... ... @@ -46,7 +45,6 @@ import static org.junit.Assert.assertNotNull;
46 45 @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:thingsboard-test.properties"})
47 46 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
48 47 @Configuration
49   -@EnableAutoConfiguration
50 48 @ComponentScan({"org.thingsboard.server"})
51 49 @WebAppConfiguration
52 50 @IntegrationTest("server.port:8080")
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.dao;
18 18 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
19 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
20 20 import org.springframework.boot.autoconfigure.domain.EntityScan;
  21 +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
21 22 import org.springframework.context.annotation.ComponentScan;
22 23 import org.springframework.context.annotation.Configuration;
23 24 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
... ... @@ -28,11 +29,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
28 29 */
29 30 @Configuration
30 31 @EnableAutoConfiguration
31   -@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
32 32 @ComponentScan("org.thingsboard.server.dao.sql")
33 33 @EnableJpaRepositories("org.thingsboard.server.dao.sql")
34 34 @EntityScan("org.thingsboard.server.dao.model.sql")
35 35 @EnableTransactionManagement
  36 +@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
36 37 public class JpaDaoConfig {
37 38
38 39 }
... ...
  1 +/**
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.dao;
  17 +
  18 +import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  19 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  20 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  21 +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
  22 +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
  23 +import org.springframework.context.annotation.Configuration;
  24 +
  25 +@Configuration
  26 +@EnableAutoConfiguration(
  27 + exclude = {
  28 + DataSourceAutoConfiguration.class,
  29 + DataSourceTransactionManagerAutoConfiguration.class,
  30 + HibernateJpaAutoConfiguration.class})
  31 +@ConditionalOnProperty(prefix = "cassandra", value = "enabled", havingValue = "true")
  32 +public class NoSqlDaoConfig {
  33 +}
... ...
dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeEntity.java renamed from dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeProjection.java
... ... @@ -15,9 +15,14 @@
15 15 */
16 16 package org.thingsboard.server.dao.model.sql;
17 17
18   -public interface TenantDeviceTypeProjection {
  18 +import lombok.AllArgsConstructor;
  19 +import lombok.Data;
19 20
20   - String getTenantId();
  21 +import java.util.UUID;
21 22
22   - String getType();
  23 +@AllArgsConstructor
  24 +@Data
  25 +public class TenantDeviceTypeEntity {
  26 + private UUID tenantId;
  27 + private String type;
23 28 }
... ...
... ... @@ -82,8 +82,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<
82 82 @Override
83 83 public ListenableFuture<D> findByIdAsync(UUID key) {
84 84 log.debug("Get entity by key async {}", key);
85   - ListenableFuture<D> listenableFuture = service.submit(() -> DaoUtil.getData(getCrudRepository().findOne(key)));
86   - return listenableFuture;
  85 + return service.submit(() -> DaoUtil.getData(getCrudRepository().findOne(key)));
87 86 }
88 87
89 88 @Override
... ...
... ... @@ -17,8 +17,8 @@ package org.thingsboard.server.dao.sql.alarm;
17 17
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20   -import org.springframework.data.repository.CrudRepository;
21   -import org.thingsboard.server.common.data.alarm.Alarm;
  20 +import org.springframework.data.repository.PagingAndSortingRepository;
  21 +import org.springframework.data.repository.query.Param;
22 22 import org.thingsboard.server.dao.model.sql.AlarmEntity;
23 23
24 24 import java.util.UUID;
... ... @@ -27,9 +27,12 @@ import java.util.UUID;
27 27 * Created by Valerii Sosliuk on 5/21/2017.
28 28 */
29 29 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
30   -public interface AlarmRepository extends CrudRepository<AlarmEntity, UUID> {
  30 +public interface AlarmRepository extends PagingAndSortingRepository<AlarmEntity, UUID> {
31 31
32   - @Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = ?1 AND ORIGINATOR_ID = ?2 " +
33   - "AND ?3 = ?3 AND TYPE = ?4 ORDER BY ID DESC LIMIT 1")
34   - AlarmEntity findLatestByOriginatorAndType(UUID tenantId, UUID originatorId, int entityType, String alarmType);
  32 + @Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = :tenantId AND ORIGINATOR_ID = :originatorId " +
  33 + "AND ORIGINATOR_TYPE = :entityType AND TYPE = :alarmType ORDER BY TYPE ASC, ID DESC LIMIT 1")
  34 + AlarmEntity findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId,
  35 + @Param("originatorId") UUID originatorId,
  36 + @Param("entityType") int entityType,
  37 + @Param("alarmType") String alarmType);
35 38 }
... ...
... ... @@ -15,7 +15,9 @@
15 15 */
16 16 package org.thingsboard.server.dao.sql.alarm;
17 17
18   -import com.google.common.util.concurrent.*;
  18 +import com.google.common.util.concurrent.AsyncFunction;
  19 +import com.google.common.util.concurrent.Futures;
  20 +import com.google.common.util.concurrent.ListenableFuture;
19 21 import lombok.extern.slf4j.Slf4j;
20 22 import org.springframework.beans.factory.annotation.Autowired;
21 23 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
... ... @@ -39,7 +41,6 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao;
39 41 import java.util.ArrayList;
40 42 import java.util.List;
41 43 import java.util.UUID;
42   -import java.util.concurrent.Executors;
43 44
44 45 import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW;
45 46
... ... @@ -70,9 +71,12 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
70 71 @Override
71 72 @Transactional(propagation = REQUIRES_NEW)
72 73 public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
73   - return service.submit(() -> DaoUtil.getData(
74   - alarmRepository.findLatestByOriginatorAndType(tenantId.getId(), originator.getId(),
75   - originator.getEntityType().ordinal(), type)));
  74 + return service.submit(() ->
  75 + DaoUtil.getData(alarmRepository.findLatestByOriginatorAndType(
  76 + tenantId.getId(),
  77 + originator.getId(),
  78 + originator.getEntityType().ordinal(),
  79 + type)));
76 80 }
77 81
78 82 @Override
... ...
... ... @@ -18,12 +18,11 @@ package org.thingsboard.server.dao.sql.asset;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21   -import org.thingsboard.server.common.data.asset.Asset;
  21 +import org.springframework.data.repository.query.Param;
22 22 import org.thingsboard.server.common.data.asset.TenantAssetType;
23 23 import org.thingsboard.server.dao.model.sql.AssetEntity;
24 24
25 25 import java.util.List;
26   -import java.util.Optional;
27 26 import java.util.UUID;
28 27
29 28 /**
... ... @@ -31,28 +30,24 @@ import java.util.UUID;
31 30 */
32 31 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
33 32 public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
34   -//
35   - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " +
36   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
37   - "ORDER BY ID LIMIT ?1")
38   - List<AssetEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
39 33
40   - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " +
41   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
42   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
43   - List<AssetEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  34 + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
  35 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  36 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  37 + List<AssetEntity> findByTenantId(@Param("limit") int limit,
  38 + @Param("tenantId") UUID tenantId,
  39 + @Param("textSearch") String textSearch,
  40 + @Param("idOffset") UUID idOffset);
44 41
45   - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " +
46   - "AND CUSTOMER_ID = ?3 " +
47   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
48   - "ORDER BY ID LIMIT ?1")
49   - List<AssetEntity> findByTenantIdAndCustomerIdFirstPage(int limit, UUID tenantId, UUID customerId, String textSearch);
50   -
51   - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " +
52   - "AND CUSTOMER_ID = ?3 " +
53   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
54   - "AND ID > ?5 ORDER BY ID LIMIT ?1")
55   - List<AssetEntity> findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String textSearch, UUID idOffset);
  42 + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
  43 + "AND CUSTOMER_ID = :customerId " +
  44 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  45 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  46 + List<AssetEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
  47 + @Param("tenantId") UUID tenantId,
  48 + @Param("customerId") UUID customerId,
  49 + @Param("textSearch") String textSearch,
  50 + @Param("idOffset") UUID idOffset);
56 51
57 52 List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds);
58 53
... ... @@ -60,17 +55,16 @@ public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
60 55
61 56 AssetEntity findByTenantIdAndName(UUID tenantId, String name);
62 57
63   - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " +
64   - "AND CUSTOMER_ID = ?3 AND TYPE = ?4 " +
65   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?5, '%')) " +
66   - "ORDER BY ID LIMIT ?1")
67   - List<AssetEntity> findByTenantIdAndCustomerIdAndTypeFirstPage(int limit, UUID tenantId, UUID customerId, String type, String textSearch);
68   -
69   - @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " +
70   - "AND CUSTOMER_ID = ?3 AND TYPE = ?4 " +
71   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?5, '%')) " +
72   - "AND ID > ?6 ORDER BY ID LIMIT ?1")
73   - List<AssetEntity> findByTenantIdAndCustomerIdAndTypeNextPage(int limit, UUID tenantId, UUID customerId, String type, String textSearch, UUID idOffset);
  58 + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
  59 + "AND CUSTOMER_ID = :customerId AND TYPE = :type " +
  60 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  61 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  62 + List<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("limit") int limit,
  63 + @Param("tenantId") UUID tenantId,
  64 + @Param("customerId") UUID customerId,
  65 + @Param("type") String type,
  66 + @Param("textSearch") String textSearch,
  67 + @Param("idOffset") UUID idOffset);
74 68
75 69 @Query(value = "SELECT NEW org.thingsboard.server.common.data.asset.TenantAssetType(a.type, a.tenantId) FROM AssetEntity a GROUP BY a.tenantId, a.type")
76 70 List<TenantAssetType> findTenantAssetTypes();
... ...
... ... @@ -16,8 +16,6 @@
16 16 package org.thingsboard.server.dao.sql.asset;
17 17
18 18 import com.google.common.util.concurrent.ListenableFuture;
19   -import com.google.common.util.concurrent.ListeningExecutorService;
20   -import com.google.common.util.concurrent.MoreExecutors;
21 19 import org.springframework.beans.factory.annotation.Autowired;
22 20 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
23 21 import org.springframework.data.repository.CrudRepository;
... ... @@ -33,7 +31,8 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
33 31 import java.util.List;
34 32 import java.util.Optional;
35 33 import java.util.UUID;
36   -import java.util.concurrent.Executors;
  34 +
  35 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
37 36
38 37 /**
39 38 * Created by Valerii Sosliuk on 5/19/2017.
... ... @@ -57,13 +56,12 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
57 56
58 57 @Override
59 58 public List<Asset> findAssetsByTenantId(UUID tenantId, TextPageLink pageLink) {
60   - if (pageLink.getIdOffset() == null) {
61   - return DaoUtil.convertDataList(assetRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId,
62   - pageLink.getTextSearch()));
63   - } else {
64   - return DaoUtil.convertDataList(assetRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId,
65   - pageLink.getTextSearch(), pageLink.getIdOffset()));
66   - }
  59 + return DaoUtil.convertDataList(assetRepository
  60 + .findByTenantId(
  61 + pageLink.getLimit(),
  62 + tenantId,
  63 + pageLink.getTextSearch(),
  64 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
67 65 }
68 66
69 67 @Override
... ... @@ -74,19 +72,19 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
74 72
75 73 @Override
76 74 public List<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
77   - if (pageLink.getIdOffset() == null) {
78   - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdFirstPage(pageLink.getLimit(), tenantId,
79   - customerId, pageLink.getTextSearch()));
80   - } else {
81   - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdNextPage(pageLink.getLimit(), tenantId,
82   - customerId, pageLink.getTextSearch(), pageLink.getIdOffset()));
83   - }
  75 + return DaoUtil.convertDataList(assetRepository
  76 + .findByTenantIdAndCustomerId(
  77 + pageLink.getLimit(),
  78 + tenantId,
  79 + customerId,
  80 + pageLink.getTextSearch(),
  81 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
84 82 }
85 83
86 84 @Override
87 85 public ListenableFuture<List<Asset>> findAssetsByTenantIdAndCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> assetIds) {
88 86 return service.submit(() ->
89   - DaoUtil.convertDataList( assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds)));
  87 + DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds)));
90 88 }
91 89
92 90 @Override
... ... @@ -102,13 +100,14 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
102 100
103 101 @Override
104 102 public List<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) {
105   - if (pageLink.getIdOffset() == null) {
106   - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndTypeFirstPage(pageLink.getLimit(), tenantId,
107   - customerId, type, pageLink.getTextSearch()));
108   - } else {
109   - return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndTypeNextPage(pageLink.getLimit(), tenantId,
110   - customerId, type, pageLink.getTextSearch(), pageLink.getIdOffset()));
111   - }
  103 + return DaoUtil.convertDataList(assetRepository
  104 + .findByTenantIdAndCustomerIdAndType(
  105 + pageLink.getLimit(),
  106 + tenantId,
  107 + customerId,
  108 + type,
  109 + pageLink.getTextSearch(),
  110 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
112 111 }
113 112
114 113 @Override
... ...
... ... @@ -18,13 +18,9 @@ package org.thingsboard.server.dao.sql.component;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21   -import org.springframework.stereotype.Component;
22   -import org.thingsboard.server.common.data.plugin.ComponentScope;
23   -import org.thingsboard.server.common.data.plugin.ComponentType;
24   -import org.thingsboard.server.dao.model.ToData;
  21 +import org.springframework.data.repository.query.Param;
25 22 import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
26 23
27   -import java.util.Collection;
28 24 import java.util.List;
29 25 import java.util.UUID;
30 26
... ... @@ -36,25 +32,22 @@ public interface ComponentDescriptorRepository extends CrudRepository<ComponentD
36 32
37 33 ComponentDescriptorEntity findByClazz(String clazz);
38 34
39   - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
40   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
41   - "ORDER BY ID LIMIT ?1")
42   - List<ComponentDescriptorEntity> findByTypeFirstPage(int limit, String type, String textSearch);
43   -
44   - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
45   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
46   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
47   - List<ComponentDescriptorEntity> findByTypeNextPage(int limit, String type, String textSearch, UUID idOffset);
48   -
49   - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
50   - "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
51   - "ORDER BY ID LIMIT ?1")
52   - List<ComponentDescriptorEntity> findByScopeAndTypeFirstPage(int limit, String type, String scope, String textSearch);
53   -
54   - @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
55   - "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
56   - "AND ID > ?5 ORDER BY ID LIMIT ?1")
57   - List<ComponentDescriptorEntity> findByScopeAndTypeNextPage(int limit, String type, String scope, String textSearch, UUID idOffset);
  35 + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
  36 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  37 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  38 + List<ComponentDescriptorEntity> findByType(@Param("limit") int limit,
  39 + @Param("type") String type,
  40 + @Param("textSearch") String textSearch,
  41 + @Param("idOffset") UUID idOffset);
  42 +
  43 + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
  44 + "AND SCOPE = :scope AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  45 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  46 + List<ComponentDescriptorEntity> findByScopeAndType(@Param("limit") int limit,
  47 + @Param("type") String type,
  48 + @Param("scope") String scope,
  49 + @Param("textSearch") String textSearch,
  50 + @Param("idOffset") UUID idOffset);
58 51
59 52 void deleteByClazz(String clazz);
60 53 }
... ...
... ... @@ -34,13 +34,15 @@ import java.util.List;
34 34 import java.util.Optional;
35 35 import java.util.UUID;
36 36
  37 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
  38 +
37 39 /**
38 40 * Created by Valerii Sosliuk on 5/6/2017.
39 41 */
40 42 @Component
41 43 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
42 44 public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<ComponentDescriptorEntity, ComponentDescriptor>
43   - implements ComponentDescriptorDao {
  45 + implements ComponentDescriptorDao {
44 46
45 47 @Autowired
46 48 private ComponentDescriptorRepository componentDescriptorRepository;
... ... @@ -79,24 +81,23 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp
79 81
80 82 @Override
81 83 public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
82   - if (pageLink.getIdOffset() == null) {
83   - return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeFirstPage(pageLink.getLimit(),
84   - type.toString(), pageLink.getTextSearch()));
85   - } else {
86   - return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeNextPage(pageLink.getLimit(),
87   - type.toString(), pageLink.getTextSearch(), pageLink.getIdOffset()));
88   - }
  84 + return DaoUtil.convertDataList(componentDescriptorRepository
  85 + .findByType(
  86 + pageLink.getLimit(),
  87 + type.toString(),
  88 + pageLink.getTextSearch(),
  89 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
89 90 }
90 91
91 92 @Override
92 93 public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
93   - if (pageLink.getIdOffset() == null) {
94   - return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeFirstPage(pageLink.getLimit(),
95   - type.toString(), scope.toString(), pageLink.getTextSearch()));
96   - } else {
97   - return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeNextPage(pageLink.getLimit(),
98   - type.toString(), scope.toString(), pageLink.getTextSearch(), pageLink.getIdOffset()));
99   - }
  94 + return DaoUtil.convertDataList(componentDescriptorRepository
  95 + .findByScopeAndType(
  96 + pageLink.getLimit(),
  97 + type.toString(),
  98 + scope.toString(),
  99 + pageLink.getTextSearch(),
  100 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
100 101 }
101 102
102 103 @Override
... ...
... ... @@ -18,7 +18,7 @@ package org.thingsboard.server.dao.sql.customer;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21   -import org.thingsboard.server.common.data.Customer;
  21 +import org.springframework.data.repository.query.Param;
22 22 import org.thingsboard.server.dao.model.sql.CustomerEntity;
23 23
24 24 import java.util.List;
... ... @@ -30,15 +30,13 @@ import java.util.UUID;
30 30 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
31 31 public interface CustomerRepository extends CrudRepository<CustomerEntity, UUID> {
32 32
33   - @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " +
34   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
35   - "ORDER BY ID LIMIT ?1")
36   - List<CustomerEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
37   -
38   - @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " +
39   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
40   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
41   - List<CustomerEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  33 + @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = :tenantId " +
  34 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  35 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  36 + List<CustomerEntity> findByTenantId(@Param("limit") int limit,
  37 + @Param("tenantId") UUID tenantId,
  38 + @Param("textSearch") String textSearch,
  39 + @Param("idOffset") UUID idOffset);
42 40
43 41 CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);
44 42
... ...
... ... @@ -23,7 +23,6 @@ import org.thingsboard.server.common.data.Customer;
23 23 import org.thingsboard.server.common.data.page.TextPageLink;
24 24 import org.thingsboard.server.dao.DaoUtil;
25 25 import org.thingsboard.server.dao.customer.CustomerDao;
26   -import org.thingsboard.server.dao.model.ModelConstants;
27 26 import org.thingsboard.server.dao.model.sql.CustomerEntity;
28 27 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
29 28
... ... @@ -31,12 +30,14 @@ import java.util.List;
31 30 import java.util.Optional;
32 31 import java.util.UUID;
33 32
  33 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
  34 +
34 35 /**
35 36 * Created by Valerii Sosliuk on 5/6/2017.
36 37 */
37 38 @Component
38 39 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
39   -public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao{
  40 +public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao {
40 41
41 42 @Autowired
42 43 private CustomerRepository customerRepository;
... ... @@ -53,12 +54,8 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus
53 54
54 55 @Override
55 56 public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
56   - if (pageLink.getIdOffset() == null) {
57   - return DaoUtil.convertDataList(customerRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch()));
58   - } else {
59   - return DaoUtil.convertDataList(customerRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId,
60   - pageLink.getTextSearch(), pageLink.getIdOffset()));
61   - }
  57 + return DaoUtil.convertDataList(customerRepository.findByTenantId(pageLink.getLimit(), tenantId,
  58 + pageLink.getTextSearch(), pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
62 59 }
63 60
64 61 @Override
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.dashboard;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
  21 +import org.springframework.data.repository.query.Param;
21 22 import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
22 23
23 24 import java.util.List;
... ... @@ -29,23 +30,20 @@ import java.util.UUID;
29 30 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
30 31 public interface DashboardInfoRepository extends CrudRepository<DashboardInfoEntity, UUID> {
31 32
32   - @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
33   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
34   - "ORDER BY ID LIMIT ?1")
35   - List<DashboardInfoEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
  33 + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
  34 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  35 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  36 + List<DashboardInfoEntity> findByTenantId(@Param("limit") int limit,
  37 + @Param("tenantId") UUID tenantId,
  38 + @Param("textSearch") String textSearch,
  39 + @Param("idOffset") UUID idOffset);
36 40
37   - @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
38   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
39   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
40   - List<DashboardInfoEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
41   -
42   - @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
43   - "AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
44   - "ORDER BY ID LIMIT ?1")
45   - List<DashboardInfoEntity> findByTenantIdAndCustomerIdFirstPage(int limit, UUID tenantId, UUID customerId, String textSearch);
46   -
47   - @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
48   - "AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
49   - "AND ID > ?5 ORDER BY ID LIMIT ?1")
50   - List<DashboardInfoEntity> findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String textSearch, UUID idOffset);
  41 + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
  42 + "AND CUSTOMER_ID = :customerId AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  43 + "AND ID > :idOffset ORDER BY ID LIMIT :limit?1")
  44 + List<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
  45 + @Param("tenantId") UUID tenantId,
  46 + @Param("customerId") UUID customerId,
  47 + @Param("textSearch") String textSearch,
  48 + @Param("idOffset") UUID idOffset);
51 49 }
... ...
... ... @@ -29,7 +29,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
29 29 import java.util.List;
30 30 import java.util.UUID;
31 31
32   -import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME;
  32 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
33 33
34 34 /**
35 35 * Created by Valerii Sosliuk on 5/6/2017.
... ... @@ -53,23 +53,22 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE
53 53
54 54 @Override
55 55 public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
56   - if (pageLink.getIdOffset() == null) {
57   - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdFirstPage(
58   - pageLink.getLimit(), tenantId, pageLink.getTextSearch()));
59   - } else {
60   - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdNextPage(
61   - pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
62   - }
  56 + return DaoUtil.convertDataList(dashboardInfoRepository
  57 + .findByTenantId(
  58 + pageLink.getLimit(),
  59 + tenantId,
  60 + pageLink.getTextSearch(),
  61 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
63 62 }
64 63
65 64 @Override
66 65 public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
67   - if (pageLink.getIdOffset() == null) {
68   - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdFirstPage(
69   - pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch()));
70   - } else {
71   - return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdNextPage(
72   - pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch(), pageLink.getIdOffset()));
73   - }
  66 + return DaoUtil.convertDataList(dashboardInfoRepository
  67 + .findByTenantIdAndCustomerId(
  68 + pageLink.getLimit(),
  69 + tenantId,
  70 + customerId,
  71 + pageLink.getTextSearch(),
  72 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
74 73 }
75 74 }
... ...
... ... @@ -19,11 +19,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21 21 import org.springframework.data.repository.query.Param;
22   -import org.springframework.stereotype.Repository;
23 22 import org.thingsboard.server.dao.model.sql.DeviceEntity;
24   -import org.thingsboard.server.dao.model.sql.TenantDeviceTypeProjection;
  23 +import org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity;
25 24
26   -import java.util.Collection;
27 25 import java.util.List;
28 26 import java.util.UUID;
29 27
... ... @@ -74,12 +72,8 @@ public interface DeviceRepository extends CrudRepository<DeviceEntity, UUID> {
74 72 @Param("textSearch") String textSearch,
75 73 @Param("idOffset") UUID idOffset);
76 74
77   - // TODO: CAST was used because in other case when you try convert directly UUID field to UUID java object error throwed:
78   - // org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
79   - // I suppose that Spring Projection doesn't support correct mapping for this type of column
80   - // and only Entity at the moment supports UUID
81   - @Query(value = "SELECT DISTINCT CAST(TENANT_ID as VARCHAR) as tenantId, TYPE as type FROM DEVICE", nativeQuery = true)
82   - List<TenantDeviceTypeProjection> findTenantDeviceTypes();
  75 + @Query(value = "SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d")
  76 + List<TenantDeviceTypeEntity> findTenantDeviceTypes();
83 77
84 78 DeviceEntity findByTenantIdAndName(UUID tenantId, String name);
85 79
... ...
... ... @@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.page.TextPageLink;
27 27 import org.thingsboard.server.dao.DaoUtil;
28 28 import org.thingsboard.server.dao.device.DeviceDao;
29 29 import org.thingsboard.server.dao.model.sql.DeviceEntity;
30   -import org.thingsboard.server.dao.model.sql.TenantDeviceTypeProjection;
  30 +import org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity;
31 31 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
32 32
33 33 import java.util.*;
... ... @@ -121,15 +121,15 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
121 121
122 122 @Override
123 123 public ListenableFuture<List<TenantDeviceType>> findTenantDeviceTypesAsync() {
124   - return service.submit(() -> convertTenantDeviceTypeToDto(deviceRepository.findTenantDeviceTypes()));
  124 + return service.submit(() -> convertTenantDeviceTypeEntityToDto(deviceRepository.findTenantDeviceTypes()));
125 125 }
126 126
127   - private List<TenantDeviceType> convertTenantDeviceTypeToDto(List<TenantDeviceTypeProjection> resultSet) {
  127 + private List<TenantDeviceType> convertTenantDeviceTypeEntityToDto(List<TenantDeviceTypeEntity> entities) {
128 128 List<TenantDeviceType> list = Collections.emptyList();
129   - if (resultSet != null && !resultSet.isEmpty()) {
  129 + if (entities != null && !entities.isEmpty()) {
130 130 list = new ArrayList<>();
131   - for (TenantDeviceTypeProjection object : resultSet) {
132   - list.add(new TenantDeviceType(object.getType(), new TenantId(UUID.fromString(object.getTenantId()))));
  131 + for (TenantDeviceTypeEntity entity : entities) {
  132 + list.add(new TenantDeviceType(entity.getType(), new TenantId(entity.getTenantId())));
133 133 }
134 134 }
135 135 return list;
... ...
... ... @@ -17,14 +17,10 @@ package org.thingsboard.server.dao.sql.event;
17 17
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
20   -import org.springframework.data.jpa.repository.Query;
21 20 import org.springframework.data.repository.CrudRepository;
22   -import org.springframework.data.repository.query.Param;
23 21 import org.thingsboard.server.common.data.EntityType;
24   -import org.thingsboard.server.common.data.Event;
25 22 import org.thingsboard.server.dao.model.sql.EventEntity;
26 23
27   -import java.util.List;
28 24 import java.util.UUID;
29 25
30 26 /**
... ...
... ... @@ -25,16 +25,16 @@ import org.thingsboard.server.common.data.id.TenantId;
25 25 import org.thingsboard.server.common.data.page.TextPageLink;
26 26 import org.thingsboard.server.common.data.plugin.PluginMetaData;
27 27 import org.thingsboard.server.dao.DaoUtil;
28   -import org.thingsboard.server.dao.model.ModelConstants;
29 28 import org.thingsboard.server.dao.model.sql.PluginMetaDataEntity;
30 29 import org.thingsboard.server.dao.plugin.PluginDao;
31   -import org.thingsboard.server.dao.sql.JpaAbstractDao;
32 30 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
33 31
34 32 import java.util.Arrays;
35 33 import java.util.List;
36 34 import java.util.UUID;
37 35
  36 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
  37 +
38 38 /**
39 39 * Created by Valerii Sosliuk on 5/1/2017.
40 40 */
... ... @@ -93,15 +93,13 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
93 93
94 94 @Override
95 95 public List<PluginMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
96   - log.debug("Try to find здгпшты by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
97   - List<PluginMetaDataEntity> entities;
98   - if (pageLink.getIdOffset() == null) {
99   - entities = pluginMetaDataRepository
100   - .findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch());
101   - } else {
102   - entities = pluginMetaDataRepository
103   - .findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset());
104   - }
  96 + log.debug("Try to find plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
  97 + List<PluginMetaDataEntity> entities = pluginMetaDataRepository
  98 + .findByTenantIdAndPageLink(
  99 + pageLink.getLimit(),
  100 + tenantId.getId(),
  101 + pageLink.getTextSearch(),
  102 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
105 103 if (log.isTraceEnabled()) {
106 104 log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
107 105 } else {
... ... @@ -113,14 +111,13 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
113 111 @Override
114 112 public List<PluginMetaData> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) {
115 113 log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
116   - List<PluginMetaDataEntity> entities;
117   - if (pageLink.getIdOffset() == null) {
118   - entities = pluginMetaDataRepository
119   - .findAllTenantPluginsByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch());
120   - } else {
121   - entities = pluginMetaDataRepository
122   - .findAllTenantPluginsByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset());
123   - }
  114 + List<PluginMetaDataEntity> entities = pluginMetaDataRepository
  115 + .findAllTenantPluginsByTenantId(
  116 + pageLink.getLimit(),
  117 + tenantId,
  118 + NULL_UUID,
  119 + pageLink.getTextSearch(),
  120 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
124 121 if (log.isTraceEnabled()) {
125 122 log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
126 123 } else {
... ...
... ... @@ -18,9 +18,8 @@ package org.thingsboard.server.dao.sql.plugin;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21   -import org.thingsboard.server.common.data.plugin.PluginMetaData;
  21 +import org.springframework.data.repository.query.Param;
22 22 import org.thingsboard.server.dao.model.sql.PluginMetaDataEntity;
23   -import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
24 23
25 24 import java.util.List;
26 25 import java.util.UUID;
... ... @@ -33,23 +32,20 @@ public interface PluginMetaDataRepository extends CrudRepository<PluginMetaDataE
33 32
34 33 PluginMetaDataEntity findByApiToken(String apiToken);
35 34
36   - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " +
37   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
38   - "ORDER BY ID LIMIT ?1")
39   - List<PluginMetaDataEntity> findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch);
40   -
41   - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " +
42   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
43   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
44   - List<PluginMetaDataEntity> findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
45   -
46   - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
47   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
48   - "ORDER BY ID LIMIT ?1")
49   - List<PluginMetaDataEntity> findAllTenantPluginsByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
50   -
51   - @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
52   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
53   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
54   - List<PluginMetaDataEntity> findAllTenantPluginsByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  35 + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = :tenantId " +
  36 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  37 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  38 + List<PluginMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
  39 + @Param("tenantId") UUID tenantId,
  40 + @Param("textSearch") String textSearch,
  41 + @Param("idOffset") UUID idOffset);
  42 +
  43 + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
  44 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  45 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  46 + List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(@Param("limit") int limit,
  47 + @Param("tenantId") UUID tenantId,
  48 + @Param("nullTenantId") UUID nullTenantId,
  49 + @Param("textSearch") String textSearch,
  50 + @Param("idOffset") UUID idOffset);
55 51 }
... ...
... ... @@ -21,7 +21,6 @@ import com.google.common.util.concurrent.MoreExecutors;
21 21 import lombok.extern.slf4j.Slf4j;
22 22 import org.springframework.beans.factory.annotation.Autowired;
23 23 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
24   -import org.springframework.data.repository.CrudRepository;
25 24 import org.springframework.stereotype.Component;
26 25 import org.thingsboard.server.common.data.EntityType;
27 26 import org.thingsboard.server.common.data.id.EntityId;
... ... @@ -32,10 +31,8 @@ import org.thingsboard.server.dao.DaoUtil;
32 31 import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
33 32 import org.thingsboard.server.dao.model.sql.RelationEntity;
34 33 import org.thingsboard.server.dao.relation.RelationDao;
35   -import org.thingsboard.server.dao.sql.JpaAbstractDao;
36 34
37 35 import java.util.List;
38   -import java.util.UUID;
39 36 import java.util.concurrent.Executors;
40 37
41 38 /**
... ... @@ -111,8 +108,9 @@ public class JpaRelationDao implements RelationDao {
111 108 RelationCompositeKey key = new RelationCompositeKey(relation);
112 109 return executorService.submit(
113 110 () -> {
  111 + boolean relationExistsBeforeDelete = relationRepository.exists(key);
114 112 relationRepository.delete(key);
115   - return !relationRepository.exists(key);
  113 + return relationExistsBeforeDelete;
116 114 });
117 115 }
118 116
... ... @@ -127,9 +125,9 @@ public class JpaRelationDao implements RelationDao {
127 125 typeGroup.name());
128 126 return executorService.submit(
129 127 () -> {
130   - boolean result = relationRepository.exists(key);
  128 + boolean relationExistsBeforeDelete = relationRepository.exists(key);
131 129 relationRepository.delete(key);
132   - return result;
  130 + return relationExistsBeforeDelete;
133 131 });
134 132 }
135 133
... ... @@ -141,16 +139,17 @@ public class JpaRelationDao implements RelationDao {
141 139
142 140 return executorService.submit(
143 141 () -> {
144   - boolean result = relationRepository
  142 + boolean relationExistsBeforeDelete = relationRepository
145 143 .findAllByFromIdAndFromType(relationEntity.getFromId(), relationEntity.getFromType())
146 144 .size() > 0;
147 145 relationRepository.delete(relationEntity);
148   - return result;
  146 + return relationExistsBeforeDelete;
149 147 });
150 148 }
151 149
152 150 @Override
153 151 public ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) {
  152 +// TODO:
154 153 // executorService.submit(() -> DaoUtil.convertDataList(
155 154 // relationRepository.findRelations(
156 155 // to.getId(),
... ...
... ... @@ -15,29 +15,14 @@
15 15 */
16 16 package org.thingsboard.server.dao.sql.relation;
17 17
18   -import com.datastax.driver.core.querybuilder.QueryBuilder;
19   -import com.datastax.driver.core.querybuilder.Select;
20   -import com.google.common.util.concurrent.ListenableFuture;
21 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
22   -import org.springframework.data.jpa.repository.Query;
23 19 import org.springframework.data.repository.CrudRepository;
24   -import org.springframework.data.repository.query.Param;
25   -import org.thingsboard.server.common.data.EntityType;
26   -import org.thingsboard.server.common.data.id.EntityId;
27   -import org.thingsboard.server.common.data.page.TimePageLink;
28   -import org.thingsboard.server.common.data.relation.EntityRelation;
29   -import org.thingsboard.server.common.data.relation.RelationTypeGroup;
30   -import org.thingsboard.server.dao.CassandraAbstractSearchTimeDao;
31   -import org.thingsboard.server.dao.model.ModelConstants;
32 20 import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
33 21 import org.thingsboard.server.dao.model.sql.RelationEntity;
34 22
35   -import java.util.Arrays;
36 23 import java.util.List;
37 24 import java.util.UUID;
38 25
39   -import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
40   -
41 26 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
42 27 public interface RelationRepository extends CrudRepository<RelationEntity, RelationCompositeKey> {
43 28
... ... @@ -62,46 +47,19 @@ public interface RelationRepository extends CrudRepository<RelationEntity, Relat
62 47 List<RelationEntity> findAllByFromIdAndFromType(UUID fromId,
63 48 String fromType);
64 49
65   - @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
66   - "AND CUSTOMER_ID = :customerId " +
67   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
68   - "AND ID > :idOffset ORDER BY ID LIMIT :limit")
69   - List<RelationEntity> findRelations(@Param("fromId") UUID fromId,
70   - @Param("fromType") String fromType,
71   - @Param("toType") String toType,
72   - @Param("relationType") String relationType,
73   - @Param("relationTypeGroup") String relationTypeGroup,
74   - TimePageLink pageLink);
  50 +// @Query(nativeQuery = true, value = "SELECT * FROM RELATION WHERE FROM_ID = :fromId " +
  51 +// "AND FROM_TYPE = :fromType " +
  52 +// "AND TO_TYPE = :toType " +
  53 +// "AND RELATION_TYPE = :relationType " +
  54 +// "AND RELATION_TYPE_GROUP = :relationTypeGroup " +
  55 +// "AND ID > :idOffset ORDER BY RELATION_TYPE_GROUP ASC, RELATION_TYPE ASC, TO_TYPE ASC")
  56 +// List<RelationEntity> findRelations(@Param("fromId") UUID fromId,
  57 +// @Param("fromType") String fromType,
  58 +// @Param("toType") String toType,
  59 +// @Param("relationType") String relationType,
  60 +// @Param("relationTypeGroup") String relationTypeGroup,
  61 +// TimePageLink pageLink);
75 62
76 63
77   -// Select.Where query = CassandraAbstractSearchTimeDao.buildQuery(ModelConstants.RELATION_BY_TYPE_AND_CHILD_TYPE_VIEW_NAME,
78   -// Arrays.asList(eq(ModelConstants.RELATION_FROM_ID_PROPERTY, from.getId()),
79   -// eq(ModelConstants.RELATION_FROM_TYPE_PROPERTY, from.getEntityType().name()),
80   -// eq(ModelConstants.RELATION_TYPE_GROUP_PROPERTY, typeGroup.name()),
81   -// eq(ModelConstants.RELATION_TYPE_PROPERTY, relationType),
82   -// eq(ModelConstants.RELATION_TO_TYPE_PROPERTY, childType.name())),
83   -// Arrays.asList(QueryBuilder.asc(ModelConstants.RELATION_TYPE_GROUP_PROPERTY),
84   -// QueryBuilder.asc(ModelConstants.RELATION_TYPE_PROPERTY),
85   -// QueryBuilder.asc(ModelConstants.RELATION_TO_TYPE_PROPERTY)),
86 64 // pageLink, ModelConstants.RELATION_TO_ID_PROPERTY);
87 65 }
88   -
89   -// private UUID fromId;
90   -// private String fromType;
91   -// private UUID toId;
92   -// private String toType;
93   -// private String relationTypeGroup;
94   -// private String relationType;
95   -//
96   -//
97   -// ListenableFuture<Boolean> checkRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
98   -//
99   -// ListenableFuture<Boolean> saveRelation(EntityRelation relation);
100   -//
101   -// ListenableFuture<Boolean> deleteRelation(EntityRelation relation);
102   -//
103   -// ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
104   -//
105   -// ListenableFuture<Boolean> deleteOutboundRelations(EntityId entity);
106   -//
107   -// ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType toType, TimePageLink pageLink);
\ No newline at end of file
... ...
... ... @@ -25,16 +25,16 @@ import org.thingsboard.server.common.data.id.TenantId;
25 25 import org.thingsboard.server.common.data.page.TextPageLink;
26 26 import org.thingsboard.server.common.data.rule.RuleMetaData;
27 27 import org.thingsboard.server.dao.DaoUtil;
28   -import org.thingsboard.server.dao.model.ModelConstants;
29 28 import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
30 29 import org.thingsboard.server.dao.rule.RuleDao;
31   -import org.thingsboard.server.dao.sql.JpaAbstractDao;
32 30 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
33 31
34 32 import java.util.Arrays;
35 33 import java.util.List;
36 34 import java.util.UUID;
37 35
  36 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
  37 +
38 38 /**
39 39 * Created by Valerii Sosliuk on 4/30/2017.
40 40 */
... ... @@ -70,14 +70,13 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
70 70 @Override
71 71 public List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
72 72 log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
73   - List<RuleMetaDataEntity> entities;
74   - if (pageLink.getIdOffset() == null) {
75   - entities = ruleMetaDataRepository
76   - .findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch());
77   - } else {
78   - entities = ruleMetaDataRepository
79   - .findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset());
80   - }
  73 + List<RuleMetaDataEntity> entities =
  74 + ruleMetaDataRepository
  75 + .findByTenantIdAndPageLink(
  76 + pageLink.getLimit(),
  77 + tenantId.getId(),
  78 + pageLink.getTextSearch(),
  79 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
81 80 if (log.isTraceEnabled()) {
82 81 log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
83 82 } else {
... ... @@ -89,14 +88,15 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
89 88 @Override
90 89 public List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) {
91 90 log.debug("Try to find all tenant rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
92   - List<RuleMetaDataEntity> entities;
93   - if (pageLink.getIdOffset() == null) {
94   - entities = ruleMetaDataRepository
95   - .findAllTenantRulesByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch());
96   - } else {
97   - entities = ruleMetaDataRepository
98   - .findAllTenantRulesByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset());
99   - }
  91 + List<RuleMetaDataEntity> entities =
  92 + ruleMetaDataRepository
  93 + .findAllTenantRulesByTenantId(
  94 + pageLink.getLimit(),
  95 + tenantId,
  96 + NULL_UUID,
  97 + pageLink.getTextSearch(),
  98 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
  99 +
100 100 if (log.isTraceEnabled()) {
101 101 log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
102 102 } else {
... ...
... ... @@ -18,11 +18,9 @@ package org.thingsboard.server.dao.sql.rule;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
21   -import org.thingsboard.server.common.data.id.TenantId;
22   -import org.thingsboard.server.dao.model.ToData;
  21 +import org.springframework.data.repository.query.Param;
23 22 import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
24 23
25   -import java.util.Collection;
26 24 import java.util.List;
27 25 import java.util.UUID;
28 26
... ... @@ -34,23 +32,20 @@ public interface RuleMetaDataRepository extends CrudRepository<RuleMetaDataEntit
34 32
35 33 List<RuleMetaDataEntity> findByPluginToken(String pluginToken);
36 34
37   - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " +
38   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
39   - "ORDER BY ID LIMIT ?1")
40   - List<RuleMetaDataEntity> findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch);
41   -
42   - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " +
43   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
44   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
45   - List<RuleMetaDataEntity> findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
46   -
47   - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
48   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
49   - "ORDER BY ID LIMIT ?1")
50   - List<RuleMetaDataEntity> findAllTenantRulesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
51   -
52   - @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " +
53   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
54   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
55   - List<RuleMetaDataEntity> findAllTenantRulesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  35 + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = :tenantId " +
  36 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  37 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  38 + List<RuleMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
  39 + @Param("tenantId") UUID tenantId,
  40 + @Param("textSearch") String textSearch,
  41 + @Param("idOffset") UUID idOffset);
  42 +
  43 + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
  44 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  45 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  46 + List<RuleMetaDataEntity> findAllTenantRulesByTenantId(@Param("limit") int limit,
  47 + @Param("tenantId") UUID tenantId,
  48 + @Param("nullTenantId") UUID nullTenantId,
  49 + @Param("textSearch") String textSearch,
  50 + @Param("idOffset") UUID idOffset);
56 51 }
... ...
... ... @@ -16,7 +16,6 @@
16 16 package org.thingsboard.server.dao.sql.settings;
17 17
18 18 import org.springframework.data.repository.CrudRepository;
19   -import org.thingsboard.server.dao.model.ToData;
20 19 import org.thingsboard.server.dao.model.sql.AdminSettingsEntity;
21 20
22 21 import java.util.UUID;
... ...
... ... @@ -28,8 +28,6 @@ import org.thingsboard.server.dao.sql.JpaAbstractDao;
28 28
29 29 import java.util.UUID;
30 30
31   -import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
32   -
33 31 @Component
34 32 @Slf4j
35 33 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
... ...
... ... @@ -23,14 +23,13 @@ import org.thingsboard.server.common.data.Tenant;
23 23 import org.thingsboard.server.common.data.page.TextPageLink;
24 24 import org.thingsboard.server.dao.DaoUtil;
25 25 import org.thingsboard.server.dao.model.sql.TenantEntity;
26   -import org.thingsboard.server.dao.sql.JpaAbstractDao;
27 26 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
28 27 import org.thingsboard.server.dao.tenant.TenantDao;
29 28
30 29 import java.util.List;
31 30 import java.util.UUID;
32 31
33   -import static org.thingsboard.server.dao.model.ModelConstants.TENANT_COLUMN_FAMILY_NAME;
  32 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
34 33
35 34 /**
36 35 * Created by Valerii Sosliuk on 4/30/2017.
... ... @@ -54,10 +53,11 @@ public class JpaTenantDao extends JpaAbstractSearchTextDao<TenantEntity, Tenant>
54 53
55 54 @Override
56 55 public List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink) {
57   - if (pageLink.getIdOffset() == null) {
58   - return DaoUtil.convertDataList(tenantRepository.findByRegionFirstPage(pageLink.getLimit(), region, pageLink.getTextSearch()));
59   - } else {
60   - return DaoUtil.convertDataList(tenantRepository.findByRegionNextPage(pageLink.getLimit(), region, pageLink.getTextSearch(), pageLink.getIdOffset()));
61   - }
  56 + return DaoUtil.convertDataList(tenantRepository
  57 + .findByRegionNextPage(
  58 + pageLink.getLimit(),
  59 + region,
  60 + pageLink.getTextSearch(),
  61 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
62 62 }
63 63 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.tenant;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
  21 +import org.springframework.data.repository.query.Param;
21 22 import org.thingsboard.server.dao.model.sql.TenantEntity;
22 23
23 24 import java.util.List;
... ... @@ -29,15 +30,11 @@ import java.util.UUID;
29 30 @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
30 31 public interface TenantRepository extends CrudRepository<TenantEntity, UUID> {
31 32
32   -
33   - @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = ?2 " +
34   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
35   - "ORDER BY ID LIMIT ?1")
36   - List<TenantEntity> findByRegionFirstPage(int limit, String region, String textSearch);
37   -
38   -
39   - @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = ?2 " +
40   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
41   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
42   - List<TenantEntity> findByRegionNextPage(int limit, String region, String textSearch, UUID idOffset);
  33 + @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = :region " +
  34 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  35 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  36 + List<TenantEntity> findByRegionNextPage(@Param("limit") int limit,
  37 + @Param("region") String region,
  38 + @Param("textSearch") String textSearch,
  39 + @Param("idOffset") UUID idOffset);
43 40 }
... ...
... ... @@ -22,7 +22,6 @@ import org.springframework.stereotype.Component;
22 22 import org.thingsboard.server.common.data.User;
23 23 import org.thingsboard.server.common.data.page.TextPageLink;
24 24 import org.thingsboard.server.dao.DaoUtil;
25   -import org.thingsboard.server.dao.model.ModelConstants;
26 25 import org.thingsboard.server.dao.model.sql.UserEntity;
27 26 import org.thingsboard.server.dao.sql.JpaAbstractDao;
28 27 import org.thingsboard.server.dao.user.UserDao;
... ... @@ -30,6 +29,8 @@ import org.thingsboard.server.dao.user.UserDao;
30 29 import java.util.List;
31 30 import java.util.UUID;
32 31
  32 +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
  33 +
33 34 /**
34 35 * @author Valerii Sosliuk
35 36 */
... ... @@ -57,20 +58,22 @@ public class JpaUserDao extends JpaAbstractDao<UserEntity, User> implements User
57 58
58 59 @Override
59 60 public List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink) {
60   - if (pageLink.getIdOffset() == null) {
61   - return DaoUtil.convertDataList(userRepository.findTenantAdminsFirstPage(pageLink.getLimit(), tenantId));
62   - } else {
63   - return DaoUtil.convertDataList(userRepository.findTenantAdminsNextPage(pageLink.getLimit(), tenantId, pageLink.getIdOffset()));
64   - }
  61 + return DaoUtil.convertDataList(
  62 + userRepository
  63 + .findTenantAdmins(
  64 + pageLink.getLimit(),
  65 + tenantId,
  66 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
65 67 }
66 68
67 69 @Override
68 70 public List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) {
69   - if (pageLink.getIdOffset() == null) {
70   - return DaoUtil.convertDataList(userRepository.findCustomerUsersFirstPage(pageLink.getLimit(), tenantId, customerId));
71   - } else {
72   - return DaoUtil.convertDataList(userRepository.findCustomerUsersNextPage(pageLink.getLimit(), tenantId,
73   - customerId, pageLink.getIdOffset()));
74   - }
  71 + return DaoUtil.convertDataList(
  72 + userRepository
  73 + .findCustomerUsers(
  74 + pageLink.getLimit(),
  75 + tenantId,
  76 + customerId,
  77 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
75 78 }
76 79 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.user;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
  21 +import org.springframework.data.repository.query.Param;
21 22 import org.thingsboard.server.dao.model.sql.UserEntity;
22 23
23 24 import java.util.List;
... ... @@ -31,24 +32,19 @@ public interface UserRepository extends CrudRepository<UserEntity, UUID> {
31 32
32 33 UserEntity findByEmail(String email);
33 34
34   - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " +
  35 + @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " +
35 36 "AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " +
36   - "ORDER BY ID LIMIT ?1")
37   - List<UserEntity> findTenantAdminsFirstPage(int limit, UUID tenantId);
38   -
39   - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " +
40   - "AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " +
41   - "AND ID > ?3 ORDER BY ID LIMIT ?1")
42   - List<UserEntity> findTenantAdminsNextPage(int limit, UUID tenantId, UUID idOffset);
43   -
44   - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " +
45   - "AND CUSTOMER_ID = ?3 AND AUTHORITY = 'CUSTOMER_USER' " +
46   - "ORDER BY ID LIMIT ?1")
47   - List<UserEntity> findCustomerUsersFirstPage(int limit, UUID tenantId, UUID customerId);
48   -
49   - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " +
50   - "AND CUSTOMER_ID = ?3 AND AUTHORITY = 'CUSTOMER_USER' " +
51   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
52   - List<UserEntity> findCustomerUsersNextPage(int limit, UUID tenantId, UUID customerId, UUID idOffset);
  37 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  38 + List<UserEntity> findTenantAdmins(@Param("limit") int limit,
  39 + @Param("tenantId") UUID tenantId,
  40 + @Param("idOffset") UUID idOffset);
  41 +
  42 + @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " +
  43 + "AND CUSTOMER_ID = :customerId AND AUTHORITY = 'CUSTOMER_USER' " +
  44 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  45 + List<UserEntity> findCustomerUsers(@Param("limit") int limit,
  46 + @Param("tenantId") UUID tenantId,
  47 + @Param("customerId") UUID customerId,
  48 + @Param("idOffset") UUID idOffset);
53 49
54 50 }
\ No newline at end of file
... ...
... ... @@ -58,34 +58,35 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
58 58
59 59 @Override
60 60 public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) {
61   - if (pageLink.getIdOffset() == null) {
62   - return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit(),
63   - pageLink.getTextSearch(), NULL_UUID));
64   - } else {
65   - return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit(),
66   - pageLink.getTextSearch(), pageLink.getIdOffset(), NULL_UUID));
67   - }
  61 + return DaoUtil.convertDataList(
  62 + widgetsBundleRepository
  63 + .findSystemWidgetsBundles(
  64 + pageLink.getLimit(),
  65 + NULL_UUID,
  66 + pageLink.getTextSearch(),
  67 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
68 68 }
69 69
70 70 @Override
71 71 public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
72   - if (pageLink.getIdOffset() == null) {
73   - return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(),
74   - tenantId, pageLink.getTextSearch()));
75   - } else {
76   - return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(),
77   - tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
78   - }
  72 + return DaoUtil.convertDataList(
  73 + widgetsBundleRepository
  74 + .findTenantWidgetsBundlesByTenantId(
  75 + pageLink.getLimit(),
  76 + tenantId,
  77 + pageLink.getTextSearch(),
  78 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
79 79 }
80 80
81 81 @Override
82 82 public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
83   - if (pageLink.getIdOffset() == null) {
84   - return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(),
85   - tenantId, pageLink.getTextSearch()));
86   - } else {
87   - return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(),
88   - tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
89   - }
  83 + return DaoUtil.convertDataList(
  84 + widgetsBundleRepository
  85 + .findAllTenantWidgetsBundlesByTenantId(
  86 + pageLink.getLimit(),
  87 + tenantId,
  88 + NULL_UUID,
  89 + pageLink.getTextSearch(),
  90 + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
90 91 }
91 92 }
... ...
... ... @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.widget;
18 18 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19 19 import org.springframework.data.jpa.repository.Query;
20 20 import org.springframework.data.repository.CrudRepository;
  21 +import org.springframework.data.repository.query.Param;
21 22 import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity;
22 23
23 24 import java.util.List;
... ... @@ -31,33 +32,28 @@ public interface WidgetsBundleRepository extends CrudRepository<WidgetsBundleEnt
31 32
32 33 WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
33 34
34   - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?3 " +
35   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " +
36   - "ORDER BY ID LIMIT ?1")
37   - List<WidgetsBundleEntity> findSystemWidgetsBundlesFirstPage(Integer limit, String searchText, UUID tenantId);
38   -
39   - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?4 " +
40   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " +
41   - "AND ID > ?3 ORDER BY ID LIMIT ?1")
42   - List<WidgetsBundleEntity> findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset, UUID tenantId);
43   -
44   - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
45   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
46   - "ORDER BY ID LIMIT ?1")
47   - List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
48   -
49   - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
50   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
51   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
52   - List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
53   -
54   - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " +
55   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
56   - "ORDER BY ID LIMIT ?1")
57   - List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
58   -
59   - @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " +
60   - "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
61   - "AND ID > ?4 ORDER BY ID LIMIT ?1")
62   - List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
  35 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :systemTenantId " +
  36 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
  37 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  38 + List<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("limit") int limit,
  39 + @Param("systemTenantId") UUID systemTenantId,
  40 + @Param("searchText") String searchText,
  41 + @Param("idOffset") UUID idOffset);
  42 +
  43 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :tenantId " +
  44 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  45 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  46 + List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
  47 + @Param("tenantId") UUID tenantId,
  48 + @Param("textSearch") String textSearch,
  49 + @Param("idOffset") UUID idOffset);
  50 +
  51 + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
  52 + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
  53 + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
  54 + List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
  55 + @Param("tenantId") UUID tenantId,
  56 + @Param("nullTenantId") UUID nullTenantId,
  57 + @Param("textSearch") String textSearch,
  58 + @Param("idOffset") UUID idOffset);
63 59 }
... ...
... ... @@ -32,7 +32,8 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe
32 32 @RunWith(SpringJUnit4ClassRunner.class)
33 33 @ContextConfiguration(classes = {JpaDaoConfig.class, JpaDbunitTestConfig.class})
34 34 @TestPropertySource("classpath:jpa-test.properties")
35   -@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
  35 +@TestExecutionListeners({
  36 + DependencyInjectionTestExecutionListener.class,
36 37 DirtiesContextTestExecutionListener.class,
37 38 DbUnitTestExecutionListener.class })
38 39 @DbUnitConfiguration(databaseConnection = "dbUnitDatabaseConnection")
... ...
... ... @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
22 22 import com.fasterxml.jackson.databind.node.TextNode;
23 23 import org.junit.runner.RunWith;
24 24 import org.springframework.beans.factory.annotation.Autowired;
25   -import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
26 25 import org.springframework.context.annotation.ComponentScan;
27 26 import org.springframework.context.annotation.Configuration;
28 27 import org.springframework.test.annotation.DirtiesContext;
... ... @@ -68,7 +67,6 @@ import java.util.concurrent.ThreadLocalRandom;
68 67 @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:application-test.properties"})
69 68 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
70 69 @Configuration
71   -@EnableAutoConfiguration
72 70 @ComponentScan("org.thingsboard.server")
73 71 public abstract class AbstractServiceTest {
74 72
... ...
... ... @@ -15,8 +15,6 @@
15 15 */
16 16 package org.thingsboard.server.dao.sql.alarm;
17 17
18   -import com.datastax.driver.core.utils.UUIDs;
19   -import com.github.springtestdbunit.annotation.DatabaseSetup;
20 18 import com.google.common.util.concurrent.ListenableFuture;
21 19 import org.junit.Test;
22 20 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -25,7 +23,6 @@ import org.thingsboard.server.common.data.alarm.Alarm;
25 23 import org.thingsboard.server.common.data.alarm.AlarmId;
26 24 import org.thingsboard.server.common.data.alarm.AlarmStatus;
27 25 import org.thingsboard.server.common.data.id.DeviceId;
28   -import org.thingsboard.server.common.data.id.EntityId;
29 26 import org.thingsboard.server.common.data.id.TenantId;
30 27 import org.thingsboard.server.dao.AbstractJpaDaoTest;
31 28 import org.thingsboard.server.dao.alarm.AlarmDao;
... ...