Browse Source

Refactored first and next dao methods

Fixed NULL_UUID
Added support for running cassandra and postgres application versions
pull/158/head
Volodymyr Babak 9 years ago
parent
commit
3534684588
  1. 10
      application/pom.xml
  2. 9
      application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java
  3. 5
      application/src/main/resources/thingsboard.yml
  4. 15
      application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java
  5. 3
      application/src/test/java/org/thingsboard/server/controller/CassandraControllerTestSuite.java
  6. 2
      application/src/test/java/org/thingsboard/server/mqtt/AbstractFeatureIntegrationTest.java
  7. 3
      dao/src/main/java/org/thingsboard/server/dao/JpaDaoConfig.java
  8. 33
      dao/src/main/java/org/thingsboard/server/dao/NoSqlDaoConfig.java
  9. 11
      dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeEntity.java
  10. 3
      dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java
  11. 15
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
  12. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
  13. 60
      dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java
  14. 49
      dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java
  15. 41
      dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
  16. 31
      dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
  17. 18
      dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
  18. 13
      dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
  19. 34
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
  20. 29
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
  21. 12
      dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java
  22. 12
      dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java
  23. 4
      dao/src/main/java/org/thingsboard/server/dao/sql/event/EventRepository.java
  24. 35
      dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java
  25. 38
      dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java
  26. 15
      dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java
  27. 66
      dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java
  28. 36
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java
  29. 39
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java
  30. 1
      dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java
  31. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java
  32. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java
  33. 19
      dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java
  34. 27
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
  35. 32
      dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
  36. 43
      dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
  37. 54
      dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
  38. 3
      dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java
  39. 2
      dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java
  40. 3
      dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java

10
application/pom.xml

@ -241,6 +241,16 @@
<artifactId>mockito-all</artifactId> <artifactId>mockito-all</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.springtestdbunit</groupId>
<artifactId>spring-test-dbunit</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

9
application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java

@ -16,18 +16,13 @@
package org.thingsboard.server; package org.thingsboard.server;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.SpringBootConfiguration;
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.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.Arrays; import java.util.Arrays;
@EnableAutoConfiguration @SpringBootConfiguration
@SpringBootApplication
@EnableSwagger2 @EnableSwagger2
@ComponentScan({"org.thingsboard.server"}) @ComponentScan({"org.thingsboard.server"})
public class ThingsboardServerApplication { public class ThingsboardServerApplication {

5
application/src/main/resources/thingsboard.yml

@ -243,7 +243,4 @@ spring:
driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}" driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}" url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}"
username: "${SPRING_DATASOURCE_USERNAME:postgres}" username: "${SPRING_DATASOURCE_USERNAME:postgres}"
password: "${SPRING_DATASOURCE_PASSWORD:postgres}" password: "${SPRING_DATASOURCE_PASSWORD:postgres}"
# autoconfigure:
# exclude:
# - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

15
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.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.runner.RunWith; 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.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationContextLoader; import org.springframework.boot.test.SpringApplicationContextLoader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders; 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.page.TextPageLink;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.config.ThingsboardSecurityConfiguration; 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.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.jwt.RefreshTokenRequest;
import org.thingsboard.server.service.security.auth.rest.LoginRequest;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset; 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.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; 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.*;
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.setup.MockMvcBuilders.webAppContextSetup; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
@ActiveProfiles("test") @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"}) @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:thingsboard-test.properties"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@Configuration @Configuration
@EnableAutoConfiguration
@ComponentScan({"org.thingsboard.server"}) @ComponentScan({"org.thingsboard.server"})
@WebAppConfiguration @WebAppConfiguration
@IntegrationTest("server.port:0") @IntegrationTest("server.port:0")
@ -113,7 +103,6 @@ public abstract class AbstractControllerTest {
MediaType.APPLICATION_JSON.getSubtype(), MediaType.APPLICATION_JSON.getSubtype(),
Charset.forName("utf8")); Charset.forName("utf8"));
protected MockMvc mockMvc; protected MockMvc mockMvc;
protected String token; protected String token;

3
application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java → application/src/test/java/org/thingsboard/server/controller/CassandraControllerTestSuite.java

@ -26,7 +26,7 @@ import java.util.Arrays;
@RunWith(ClasspathSuite.class) @RunWith(ClasspathSuite.class)
@ClassnameFilters({"org.thingsboard.server.controller.*Test"}) @ClassnameFilters({"org.thingsboard.server.controller.*Test"})
public class ControllerTestSuite { public class CassandraControllerTestSuite {
@ClassRule @ClassRule
public static CustomCassandraCQLUnit cassandraUnit = public static CustomCassandraCQLUnit cassandraUnit =
@ -35,5 +35,4 @@ public class ControllerTestSuite {
new ClassPathCQLDataSet("cassandra/system-data.cql", false, false), new ClassPathCQLDataSet("cassandra/system-data.cql", false, false),
new ClassPathCQLDataSet("system-test.cql", false, false)), new ClassPathCQLDataSet("system-test.cql", false, false)),
"cassandra-test.yaml", 30000l); "cassandra-test.yaml", 30000l);
} }

2
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.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationContextLoader; import org.springframework.boot.test.SpringApplicationContextLoader;
import org.springframework.context.annotation.ComponentScan; 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"}) @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:thingsboard-test.properties"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@Configuration @Configuration
@EnableAutoConfiguration
@ComponentScan({"org.thingsboard.server"}) @ComponentScan({"org.thingsboard.server"})
@WebAppConfiguration @WebAppConfiguration
@IntegrationTest("server.port:8080") @IntegrationTest("server.port:8080")

3
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.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.domain.EntityScan; 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.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@ -28,11 +29,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
*/ */
@Configuration @Configuration
@EnableAutoConfiguration @EnableAutoConfiguration
@ConditionalOnProperty(prefix="sql", value="enabled",havingValue = "true", matchIfMissing = false)
@ComponentScan("org.thingsboard.server.dao.sql") @ComponentScan("org.thingsboard.server.dao.sql")
@EnableJpaRepositories("org.thingsboard.server.dao.sql") @EnableJpaRepositories("org.thingsboard.server.dao.sql")
@EntityScan("org.thingsboard.server.dao.model.sql") @EntityScan("org.thingsboard.server.dao.model.sql")
@EnableTransactionManagement @EnableTransactionManagement
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
public class JpaDaoConfig { public class JpaDaoConfig {
} }

33
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 {
}

11
dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeProjection.java → dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantDeviceTypeEntity.java

@ -15,9 +15,14 @@
*/ */
package org.thingsboard.server.dao.model.sql; 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;
} }

3
dao/src/main/java/org/thingsboard/server/dao/sql/JpaAbstractDao.java

@ -82,8 +82,7 @@ public abstract class JpaAbstractDao<E extends BaseEntity<D>, D> implements Dao<
@Override @Override
public ListenableFuture<D> findByIdAsync(UUID key) { public ListenableFuture<D> findByIdAsync(UUID key) {
log.debug("Get entity by key async {}", key); log.debug("Get entity by key async {}", key);
ListenableFuture<D> listenableFuture = service.submit(() -> DaoUtil.getData(getCrudRepository().findOne(key))); return service.submit(() -> DaoUtil.getData(getCrudRepository().findOne(key)));
return listenableFuture;
} }
@Override @Override

15
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository;
import org.thingsboard.server.common.data.alarm.Alarm; import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.AlarmEntity; import org.thingsboard.server.dao.model.sql.AlarmEntity;
import java.util.UUID; import java.util.UUID;
@ -27,9 +27,12 @@ import java.util.UUID;
* Created by Valerii Sosliuk on 5/21/2017. * Created by Valerii Sosliuk on 5/21/2017.
*/ */
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public interface AlarmRepository extends CrudRepository<AlarmEntity, UUID> { public interface AlarmRepository extends PagingAndSortingRepository<AlarmEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = ?1 AND ORIGINATOR_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = :tenantId AND ORIGINATOR_ID = :originatorId " +
"AND ?3 = ?3 AND TYPE = ?4 ORDER BY ID DESC LIMIT 1") "AND ORIGINATOR_TYPE = :entityType AND TYPE = :alarmType ORDER BY TYPE ASC, ID DESC LIMIT 1")
AlarmEntity findLatestByOriginatorAndType(UUID tenantId, UUID originatorId, int entityType, String alarmType); AlarmEntity findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId,
@Param("originatorId") UUID originatorId,
@Param("entityType") int entityType,
@Param("alarmType") String alarmType);
} }

14
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java

@ -15,7 +15,9 @@
*/ */
package org.thingsboard.server.dao.sql.alarm; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 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.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.Executors;
import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW; import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW;
@ -70,9 +71,12 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
@Override @Override
@Transactional(propagation = REQUIRES_NEW) @Transactional(propagation = REQUIRES_NEW)
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
return service.submit(() -> DaoUtil.getData( return service.submit(() ->
alarmRepository.findLatestByOriginatorAndType(tenantId.getId(), originator.getId(), DaoUtil.getData(alarmRepository.findLatestByOriginatorAndType(
originator.getEntityType().ordinal(), type))); tenantId.getId(),
originator.getId(),
originator.getEntityType().ordinal(),
type)));
} }
@Override @Override

60
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; 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.common.data.asset.TenantAssetType;
import org.thingsboard.server.dao.model.sql.AssetEntity; import org.thingsboard.server.dao.model.sql.AssetEntity;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
@ -31,28 +30,24 @@ import java.util.UUID;
*/ */
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public interface AssetRepository extends CrudRepository<AssetEntity, UUID> { public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
//
@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<AssetEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > ?4 ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); List<AssetEntity> 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 " + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = ?3 " + "AND CUSTOMER_ID = :customerId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantIdAndCustomerIdFirstPage(int limit, UUID tenantId, UUID customerId, String textSearch); List<AssetEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " + @Param("customerId") UUID customerId,
"AND CUSTOMER_ID = ?3 " + @Param("textSearch") String textSearch,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + @Param("idOffset") UUID idOffset);
"AND ID > ?5 ORDER BY ID LIMIT ?1")
List<AssetEntity> findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String textSearch, UUID idOffset);
List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds); List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds);
@ -60,17 +55,16 @@ public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
AssetEntity findByTenantIdAndName(UUID tenantId, String name); AssetEntity findByTenantIdAndName(UUID tenantId, String name);
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = ?3 AND TYPE = ?4 " + "AND CUSTOMER_ID = :customerId AND TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?5, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantIdAndCustomerIdAndTypeFirstPage(int limit, UUID tenantId, UUID customerId, String type, String textSearch); List<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = ?2 " + @Param("customerId") UUID customerId,
"AND CUSTOMER_ID = ?3 AND TYPE = ?4 " + @Param("type") String type,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?5, '%')) " + @Param("textSearch") String textSearch,
"AND ID > ?6 ORDER BY ID LIMIT ?1") @Param("idOffset") UUID idOffset);
List<AssetEntity> findByTenantIdAndCustomerIdAndTypeNextPage(int limit, UUID tenantId, UUID customerId, String type, String textSearch, 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") @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<TenantAssetType> findTenantAssetTypes(); List<TenantAssetType> findTenantAssetTypes();

49
dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java

@ -16,8 +16,6 @@
package org.thingsboard.server.dao.sql.asset; package org.thingsboard.server.dao.sql.asset;
import com.google.common.util.concurrent.ListenableFuture; 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.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
@ -33,7 +31,8 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; 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. * Created by Valerii Sosliuk on 5/19/2017.
@ -57,13 +56,12 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
@Override @Override
public List<Asset> findAssetsByTenantId(UUID tenantId, TextPageLink pageLink) { public List<Asset> findAssetsByTenantId(UUID tenantId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(assetRepository
return DaoUtil.convertDataList(assetRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, .findByTenantId(
pageLink.getTextSearch())); pageLink.getLimit(),
} else { tenantId,
return DaoUtil.convertDataList(assetRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(),
pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
}
} }
@Override @Override
@ -74,19 +72,19 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
@Override @Override
public List<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { public List<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(assetRepository
return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdFirstPage(pageLink.getLimit(), tenantId, .findByTenantIdAndCustomerId(
customerId, pageLink.getTextSearch())); pageLink.getLimit(),
} else { tenantId,
return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdNextPage(pageLink.getLimit(), tenantId, customerId,
customerId, pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getTextSearch(),
} pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
@Override @Override
public ListenableFuture<List<Asset>> findAssetsByTenantIdAndCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> assetIds) { public ListenableFuture<List<Asset>> findAssetsByTenantIdAndCustomerIdAndIdsAsync(UUID tenantId, UUID customerId, List<UUID> assetIds) {
return service.submit(() -> return service.submit(() ->
DaoUtil.convertDataList( assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds))); DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndIdIn(tenantId, customerId, assetIds)));
} }
@Override @Override
@ -102,13 +100,14 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
@Override @Override
public List<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) { public List<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(assetRepository
return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndTypeFirstPage(pageLink.getLimit(), tenantId, .findByTenantIdAndCustomerIdAndType(
customerId, type, pageLink.getTextSearch())); pageLink.getLimit(),
} else { tenantId,
return DaoUtil.convertDataList(assetRepository.findByTenantIdAndCustomerIdAndTypeNextPage(pageLink.getLimit(), tenantId, customerId,
customerId, type, pageLink.getTextSearch(), pageLink.getIdOffset())); type,
} pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
@Override @Override

41
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component; import org.springframework.data.repository.query.Param;
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.thingsboard.server.dao.model.sql.ComponentDescriptorEntity; import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -36,25 +32,22 @@ public interface ComponentDescriptorRepository extends CrudRepository<ComponentD
ComponentDescriptorEntity findByClazz(String clazz); ComponentDescriptorEntity findByClazz(String clazz);
@Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<ComponentDescriptorEntity> findByTypeFirstPage(int limit, String type, String textSearch); List<ComponentDescriptorEntity> findByType(@Param("limit") int limit,
@Param("type") String type,
@Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + @Param("textSearch") String textSearch,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + @Param("idOffset") UUID idOffset);
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<ComponentDescriptorEntity> findByTypeNextPage(int limit, String type, String textSearch, UUID idOffset); @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
"AND SCOPE = :scope AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
@Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
"AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + List<ComponentDescriptorEntity> findByScopeAndType(@Param("limit") int limit,
"ORDER BY ID LIMIT ?1") @Param("type") String type,
List<ComponentDescriptorEntity> findByScopeAndTypeFirstPage(int limit, String type, String scope, String textSearch); @Param("scope") String scope,
@Param("textSearch") String textSearch,
@Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " + @Param("idOffset") UUID idOffset);
"AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
"AND ID > ?5 ORDER BY ID LIMIT ?1")
List<ComponentDescriptorEntity> findByScopeAndTypeNextPage(int limit, String type, String scope, String textSearch, UUID idOffset);
void deleteByClazz(String clazz); void deleteByClazz(String clazz);
} }

31
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.Optional;
import java.util.UUID; import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
/** /**
* Created by Valerii Sosliuk on 5/6/2017. * Created by Valerii Sosliuk on 5/6/2017.
*/ */
@Component @Component
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<ComponentDescriptorEntity, ComponentDescriptor> public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<ComponentDescriptorEntity, ComponentDescriptor>
implements ComponentDescriptorDao { implements ComponentDescriptorDao {
@Autowired @Autowired
private ComponentDescriptorRepository componentDescriptorRepository; private ComponentDescriptorRepository componentDescriptorRepository;
@ -79,24 +81,23 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp
@Override @Override
public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) { public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(componentDescriptorRepository
return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeFirstPage(pageLink.getLimit(), .findByType(
type.toString(), pageLink.getTextSearch())); pageLink.getLimit(),
} else { type.toString(),
return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeNextPage(pageLink.getLimit(), pageLink.getTextSearch(),
type.toString(), pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
}
} }
@Override @Override
public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) { public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(componentDescriptorRepository
return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeFirstPage(pageLink.getLimit(), .findByScopeAndType(
type.toString(), scope.toString(), pageLink.getTextSearch())); pageLink.getLimit(),
} else { type.toString(),
return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeNextPage(pageLink.getLimit(), scope.toString(),
type.toString(), scope.toString(), pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getTextSearch(),
} pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
@Override @Override

18
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; 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 org.thingsboard.server.dao.model.sql.CustomerEntity;
import java.util.List; import java.util.List;
@ -30,15 +30,13 @@ import java.util.UUID;
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public interface CustomerRepository extends CrudRepository<CustomerEntity, UUID> { public interface CustomerRepository extends CrudRepository<CustomerEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<CustomerEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); List<CustomerEntity> findByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " + @Param("textSearch") String textSearch,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + @Param("idOffset") UUID idOffset);
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<CustomerEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title); CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);

13
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.common.data.page.TextPageLink;
import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.customer.CustomerDao; 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.model.sql.CustomerEntity;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
@ -31,12 +30,14 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
/** /**
* Created by Valerii Sosliuk on 5/6/2017. * Created by Valerii Sosliuk on 5/6/2017.
*/ */
@Component @Component
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao{ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao {
@Autowired @Autowired
private CustomerRepository customerRepository; private CustomerRepository customerRepository;
@ -53,12 +54,8 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus
@Override @Override
public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) { public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(customerRepository.findByTenantId(pageLink.getLimit(), tenantId,
return DaoUtil.convertDataList(customerRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch())); pageLink.getTextSearch(), pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} else {
return DaoUtil.convertDataList(customerRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId,
pageLink.getTextSearch(), pageLink.getIdOffset()));
}
} }
@Override @Override

34
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.DashboardInfoEntity; import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
import java.util.List; import java.util.List;
@ -29,23 +30,20 @@ import java.util.UUID;
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public interface DashboardInfoRepository extends CrudRepository<DashboardInfoEntity, UUID> { public interface DashboardInfoRepository extends CrudRepository<DashboardInfoEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DashboardInfoEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); List<DashboardInfoEntity> 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 " + @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND CUSTOMER_ID = :customerId AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > ?4 ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit?1")
List<DashboardInfoEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); List<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " + @Param("customerId") UUID customerId,
"AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " + @Param("textSearch") String textSearch,
"ORDER BY ID LIMIT ?1") @Param("idOffset") UUID idOffset);
List<DashboardInfoEntity> 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<DashboardInfoEntity> findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String textSearch, UUID idOffset);
} }

29
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.List;
import java.util.UUID; 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. * Created by Valerii Sosliuk on 5/6/2017.
@ -53,23 +53,22 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE
@Override @Override
public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) { public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(dashboardInfoRepository
return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdFirstPage( .findByTenantId(
pageLink.getLimit(), tenantId, pageLink.getTextSearch())); pageLink.getLimit(),
} else { tenantId,
return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdNextPage( pageLink.getTextSearch(),
pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
}
} }
@Override @Override
public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(dashboardInfoRepository
return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdFirstPage( .findByTenantIdAndCustomerId(
pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch())); pageLink.getLimit(),
} else { tenantId,
return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdNextPage( customerId,
pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getTextSearch(),
} pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
} }

12
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.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param; 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.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.List;
import java.util.UUID; import java.util.UUID;
@ -74,12 +72,8 @@ public interface DeviceRepository extends CrudRepository<DeviceEntity, UUID> {
@Param("textSearch") String textSearch, @Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset); @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: @Query(value = "SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d")
// org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 List<TenantDeviceTypeEntity> findTenantDeviceTypes();
// 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<TenantDeviceTypeProjection> findTenantDeviceTypes();
DeviceEntity findByTenantIdAndName(UUID tenantId, String name); DeviceEntity findByTenantIdAndName(UUID tenantId, String name);

12
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.DaoUtil;
import org.thingsboard.server.dao.device.DeviceDao; import org.thingsboard.server.dao.device.DeviceDao;
import org.thingsboard.server.dao.model.sql.DeviceEntity; 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 org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.*; import java.util.*;
@ -121,15 +121,15 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
@Override @Override
public ListenableFuture<List<TenantDeviceType>> findTenantDeviceTypesAsync() { public ListenableFuture<List<TenantDeviceType>> findTenantDeviceTypesAsync() {
return service.submit(() -> convertTenantDeviceTypeToDto(deviceRepository.findTenantDeviceTypes())); return service.submit(() -> convertTenantDeviceTypeEntityToDto(deviceRepository.findTenantDeviceTypes()));
} }
private List<TenantDeviceType> convertTenantDeviceTypeToDto(List<TenantDeviceTypeProjection> resultSet) { private List<TenantDeviceType> convertTenantDeviceTypeEntityToDto(List<TenantDeviceTypeEntity> entities) {
List<TenantDeviceType> list = Collections.emptyList(); List<TenantDeviceType> list = Collections.emptyList();
if (resultSet != null && !resultSet.isEmpty()) { if (entities != null && !entities.isEmpty()) {
list = new ArrayList<>(); list = new ArrayList<>();
for (TenantDeviceTypeProjection object : resultSet) { for (TenantDeviceTypeEntity entity : entities) {
list.add(new TenantDeviceType(object.getType(), new TenantId(UUID.fromString(object.getTenantId())))); list.add(new TenantDeviceType(entity.getType(), new TenantId(entity.getTenantId())));
} }
} }
return list; return list;

4
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 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.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.Event;
import org.thingsboard.server.dao.model.sql.EventEntity; import org.thingsboard.server.dao.model.sql.EventEntity;
import java.util.List;
import java.util.UUID; import java.util.UUID;
/** /**

35
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.page.TextPageLink;
import org.thingsboard.server.common.data.plugin.PluginMetaData; import org.thingsboard.server.common.data.plugin.PluginMetaData;
import org.thingsboard.server.dao.DaoUtil; 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.model.sql.PluginMetaDataEntity;
import org.thingsboard.server.dao.plugin.PluginDao; import org.thingsboard.server.dao.plugin.PluginDao;
import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
/** /**
* Created by Valerii Sosliuk on 5/1/2017. * Created by Valerii Sosliuk on 5/1/2017.
*/ */
@ -93,15 +93,13 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
@Override @Override
public List<PluginMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) { public List<PluginMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
log.debug("Try to find здгпшты by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<PluginMetaDataEntity> entities; List<PluginMetaDataEntity> entities = pluginMetaDataRepository
if (pageLink.getIdOffset() == null) { .findByTenantIdAndPageLink(
entities = pluginMetaDataRepository pageLink.getLimit(),
.findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch()); tenantId.getId(),
} else { pageLink.getTextSearch(),
entities = pluginMetaDataRepository pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
.findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset());
}
if (log.isTraceEnabled()) { if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else { } else {
@ -113,14 +111,13 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
@Override @Override
public List<PluginMetaData> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) { public List<PluginMetaData> findAllTenantPluginsByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<PluginMetaDataEntity> entities; List<PluginMetaDataEntity> entities = pluginMetaDataRepository
if (pageLink.getIdOffset() == null) { .findAllTenantPluginsByTenantId(
entities = pluginMetaDataRepository pageLink.getLimit(),
.findAllTenantPluginsByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch()); tenantId,
} else { NULL_UUID,
entities = pluginMetaDataRepository pageLink.getTextSearch(),
.findAllTenantPluginsByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()); pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
}
if (log.isTraceEnabled()) { if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else { } else {

38
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; 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.PluginMetaDataEntity;
import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -33,23 +32,20 @@ public interface PluginMetaDataRepository extends CrudRepository<PluginMetaDataE
PluginMetaDataEntity findByApiToken(String apiToken); PluginMetaDataEntity findByApiToken(String apiToken);
@Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<PluginMetaDataEntity> findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch); List<PluginMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = ?2 " + @Param("textSearch") String textSearch,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + @Param("idOffset") UUID idOffset);
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<PluginMetaDataEntity> findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
@Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(@Param("limit") int limit,
"ORDER BY ID LIMIT ?1") @Param("tenantId") UUID tenantId,
List<PluginMetaDataEntity> findAllTenantPluginsByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); @Param("nullTenantId") UUID nullTenantId,
@Param("textSearch") String textSearch,
@Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + @Param("idOffset") UUID idOffset);
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<PluginMetaDataEntity> findAllTenantPluginsByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
} }

15
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.EntityId; 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.RelationCompositeKey;
import org.thingsboard.server.dao.model.sql.RelationEntity; import org.thingsboard.server.dao.model.sql.RelationEntity;
import org.thingsboard.server.dao.relation.RelationDao; import org.thingsboard.server.dao.relation.RelationDao;
import org.thingsboard.server.dao.sql.JpaAbstractDao;
import java.util.List; import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
/** /**
@ -111,8 +108,9 @@ public class JpaRelationDao implements RelationDao {
RelationCompositeKey key = new RelationCompositeKey(relation); RelationCompositeKey key = new RelationCompositeKey(relation);
return executorService.submit( return executorService.submit(
() -> { () -> {
boolean relationExistsBeforeDelete = relationRepository.exists(key);
relationRepository.delete(key); relationRepository.delete(key);
return !relationRepository.exists(key); return relationExistsBeforeDelete;
}); });
} }
@ -127,9 +125,9 @@ public class JpaRelationDao implements RelationDao {
typeGroup.name()); typeGroup.name());
return executorService.submit( return executorService.submit(
() -> { () -> {
boolean result = relationRepository.exists(key); boolean relationExistsBeforeDelete = relationRepository.exists(key);
relationRepository.delete(key); relationRepository.delete(key);
return result; return relationExistsBeforeDelete;
}); });
} }
@ -141,16 +139,17 @@ public class JpaRelationDao implements RelationDao {
return executorService.submit( return executorService.submit(
() -> { () -> {
boolean result = relationRepository boolean relationExistsBeforeDelete = relationRepository
.findAllByFromIdAndFromType(relationEntity.getFromId(), relationEntity.getFromType()) .findAllByFromIdAndFromType(relationEntity.getFromId(), relationEntity.getFromType())
.size() > 0; .size() > 0;
relationRepository.delete(relationEntity); relationRepository.delete(relationEntity);
return result; return relationExistsBeforeDelete;
}); });
} }
@Override @Override
public ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) { public ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) {
// TODO:
// executorService.submit(() -> DaoUtil.convertDataList( // executorService.submit(() -> DaoUtil.convertDataList(
// relationRepository.findRelations( // relationRepository.findRelations(
// to.getId(), // to.getId(),

66
dao/src/main/java/org/thingsboard/server/dao/sql/relation/RelationRepository.java

@ -15,29 +15,14 @@
*/ */
package org.thingsboard.server.dao.sql.relation; 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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; 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.RelationCompositeKey;
import org.thingsboard.server.dao.model.sql.RelationEntity; import org.thingsboard.server.dao.model.sql.RelationEntity;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true") @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
public interface RelationRepository extends CrudRepository<RelationEntity, RelationCompositeKey> { public interface RelationRepository extends CrudRepository<RelationEntity, RelationCompositeKey> {
@ -62,46 +47,19 @@ public interface RelationRepository extends CrudRepository<RelationEntity, Relat
List<RelationEntity> findAllByFromIdAndFromType(UUID fromId, List<RelationEntity> findAllByFromIdAndFromType(UUID fromId,
String fromType); String fromType);
@Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " + // @Query(nativeQuery = true, value = "SELECT * FROM RELATION WHERE FROM_ID = :fromId " +
"AND CUSTOMER_ID = :customerId " + // "AND FROM_TYPE = :fromType " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " + // "AND TO_TYPE = :toType " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit") // "AND RELATION_TYPE = :relationType " +
List<RelationEntity> findRelations(@Param("fromId") UUID fromId, // "AND RELATION_TYPE_GROUP = :relationTypeGroup " +
@Param("fromType") String fromType, // "AND ID > :idOffset ORDER BY RELATION_TYPE_GROUP ASC, RELATION_TYPE ASC, TO_TYPE ASC")
@Param("toType") String toType, // List<RelationEntity> findRelations(@Param("fromId") UUID fromId,
@Param("relationType") String relationType, // @Param("fromType") String fromType,
@Param("relationTypeGroup") String relationTypeGroup, // @Param("toType") String toType,
TimePageLink pageLink); // @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); // 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<Boolean> checkRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
//
// ListenableFuture<Boolean> saveRelation(EntityRelation relation);
//
// ListenableFuture<Boolean> deleteRelation(EntityRelation relation);
//
// ListenableFuture<Boolean> deleteRelation(EntityId from, EntityId to, String relationType, RelationTypeGroup typeGroup);
//
// ListenableFuture<Boolean> deleteOutboundRelations(EntityId entity);
//
// ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType toType, TimePageLink pageLink);

36
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.page.TextPageLink;
import org.thingsboard.server.common.data.rule.RuleMetaData; import org.thingsboard.server.common.data.rule.RuleMetaData;
import org.thingsboard.server.dao.DaoUtil; 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.model.sql.RuleMetaDataEntity;
import org.thingsboard.server.dao.rule.RuleDao; import org.thingsboard.server.dao.rule.RuleDao;
import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao; import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
/** /**
* Created by Valerii Sosliuk on 4/30/2017. * Created by Valerii Sosliuk on 4/30/2017.
*/ */
@ -70,14 +70,13 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
@Override @Override
public List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) { public List<RuleMetaData> findByTenantIdAndPageLink(TenantId tenantId, TextPageLink pageLink) {
log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<RuleMetaDataEntity> entities; List<RuleMetaDataEntity> entities =
if (pageLink.getIdOffset() == null) { ruleMetaDataRepository
entities = ruleMetaDataRepository .findByTenantIdAndPageLink(
.findByTenantIdAndPageLinkFirstPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch()); pageLink.getLimit(),
} else { tenantId.getId(),
entities = ruleMetaDataRepository pageLink.getTextSearch(),
.findByTenantIdAndPageLinkNextPage(pageLink.getLimit(), tenantId.getId(), pageLink.getTextSearch(), pageLink.getIdOffset()); pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
}
if (log.isTraceEnabled()) { if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else { } else {
@ -89,14 +88,15 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
@Override @Override
public List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) { public List<RuleMetaData> findAllTenantRulesByTenantId(UUID tenantId, TextPageLink pageLink) {
log.debug("Try to find all tenant rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink); log.debug("Try to find all tenant rules by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<RuleMetaDataEntity> entities; List<RuleMetaDataEntity> entities =
if (pageLink.getIdOffset() == null) { ruleMetaDataRepository
entities = ruleMetaDataRepository .findAllTenantRulesByTenantId(
.findAllTenantRulesByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch()); pageLink.getLimit(),
} else { tenantId,
entities = ruleMetaDataRepository NULL_UUID,
.findAllTenantRulesByTenantIdNextPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()); pageLink.getTextSearch(),
} pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
if (log.isTraceEnabled()) { if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else { } else {

39
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.thingsboard.server.common.data.id.TenantId; import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.ToData;
import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity; import org.thingsboard.server.dao.model.sql.RuleMetaDataEntity;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -34,23 +32,20 @@ public interface RuleMetaDataRepository extends CrudRepository<RuleMetaDataEntit
List<RuleMetaDataEntity> findByPluginToken(String pluginToken); List<RuleMetaDataEntity> findByPluginToken(String pluginToken);
@Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " + @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<RuleMetaDataEntity> findByTenantIdAndPageLinkFirstPage(int limit, UUID tenantId, String textSearch); List<RuleMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = ?2 " + @Param("textSearch") String textSearch,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + @Param("idOffset") UUID idOffset);
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<RuleMetaDataEntity> findByTenantIdAndPageLinkNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
@Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + List<RuleMetaDataEntity> findAllTenantRulesByTenantId(@Param("limit") int limit,
"ORDER BY ID LIMIT ?1") @Param("tenantId") UUID tenantId,
List<RuleMetaDataEntity> findAllTenantRulesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); @Param("nullTenantId") UUID nullTenantId,
@Param("textSearch") String textSearch,
@Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE (TENANT_ID = ?2 OR TENANT_ID IS NULL) " + @Param("idOffset") UUID idOffset);
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<RuleMetaDataEntity> findAllTenantRulesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
} }

1
dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java

@ -16,7 +16,6 @@
package org.thingsboard.server.dao.sql.settings; package org.thingsboard.server.dao.sql.settings;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.thingsboard.server.dao.model.ToData;
import org.thingsboard.server.dao.model.sql.AdminSettingsEntity; import org.thingsboard.server.dao.model.sql.AdminSettingsEntity;
import java.util.UUID; import java.util.UUID;

2
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 java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
@Component @Component
@Slf4j @Slf4j
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true") @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")

14
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.common.data.page.TextPageLink;
import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.model.sql.TenantEntity; 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.sql.JpaAbstractSearchTextDao;
import org.thingsboard.server.dao.tenant.TenantDao; import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.List; import java.util.List;
import java.util.UUID; 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. * Created by Valerii Sosliuk on 4/30/2017.
@ -54,10 +53,11 @@ public class JpaTenantDao extends JpaAbstractSearchTextDao<TenantEntity, Tenant>
@Override @Override
public List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink) { public List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(tenantRepository
return DaoUtil.convertDataList(tenantRepository.findByRegionFirstPage(pageLink.getLimit(), region, pageLink.getTextSearch())); .findByRegionNextPage(
} else { pageLink.getLimit(),
return DaoUtil.convertDataList(tenantRepository.findByRegionNextPage(pageLink.getLimit(), region, pageLink.getTextSearch(), pageLink.getIdOffset())); region,
} pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
} }

19
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.TenantEntity; import org.thingsboard.server.dao.model.sql.TenantEntity;
import java.util.List; import java.util.List;
@ -29,15 +30,11 @@ import java.util.UUID;
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
public interface TenantRepository extends CrudRepository<TenantEntity, UUID> { public interface TenantRepository extends CrudRepository<TenantEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = :region " +
@Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = ?2 " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
"ORDER BY ID LIMIT ?1") List<TenantEntity> findByRegionNextPage(@Param("limit") int limit,
List<TenantEntity> findByRegionFirstPage(int limit, String region, String textSearch); @Param("region") String region,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@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<TenantEntity> findByRegionNextPage(int limit, String region, String textSearch, UUID idOffset);
} }

27
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.User;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
import org.thingsboard.server.dao.DaoUtil; 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.model.sql.UserEntity;
import org.thingsboard.server.dao.sql.JpaAbstractDao; import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.user.UserDao; 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.List;
import java.util.UUID; import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
/** /**
* @author Valerii Sosliuk * @author Valerii Sosliuk
*/ */
@ -57,20 +58,22 @@ public class JpaUserDao extends JpaAbstractDao<UserEntity, User> implements User
@Override @Override
public List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink) { public List<User> findTenantAdmins(UUID tenantId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(
return DaoUtil.convertDataList(userRepository.findTenantAdminsFirstPage(pageLink.getLimit(), tenantId)); userRepository
} else { .findTenantAdmins(
return DaoUtil.convertDataList(userRepository.findTenantAdminsNextPage(pageLink.getLimit(), tenantId, pageLink.getIdOffset())); pageLink.getLimit(),
} tenantId,
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
@Override @Override
public List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) { public List<User> findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(
return DaoUtil.convertDataList(userRepository.findCustomerUsersFirstPage(pageLink.getLimit(), tenantId, customerId)); userRepository
} else { .findCustomerUsers(
return DaoUtil.convertDataList(userRepository.findCustomerUsersNextPage(pageLink.getLimit(), tenantId, pageLink.getLimit(),
customerId, pageLink.getIdOffset())); tenantId,
} customerId,
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
} }

32
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.UserEntity; import org.thingsboard.server.dao.model.sql.UserEntity;
import java.util.List; import java.util.List;
@ -31,24 +32,19 @@ public interface UserRepository extends CrudRepository<UserEntity, UUID> {
UserEntity findByEmail(String email); 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' " + "AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<UserEntity> findTenantAdminsFirstPage(int limit, UUID tenantId); List<UserEntity> findTenantAdmins(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " + @Param("idOffset") UUID idOffset);
"AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " +
"AND ID > ?3 ORDER BY ID LIMIT ?1") @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " +
List<UserEntity> findTenantAdminsNextPage(int limit, UUID tenantId, UUID idOffset); "AND CUSTOMER_ID = :customerId AND AUTHORITY = 'CUSTOMER_USER' " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
@Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = ?2 " + List<UserEntity> findCustomerUsers(@Param("limit") int limit,
"AND CUSTOMER_ID = ?3 AND AUTHORITY = 'CUSTOMER_USER' " + @Param("tenantId") UUID tenantId,
"ORDER BY ID LIMIT ?1") @Param("customerId") UUID customerId,
List<UserEntity> findCustomerUsersFirstPage(int limit, UUID tenantId, UUID customerId); @Param("idOffset") UUID idOffset);
@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<UserEntity> findCustomerUsersNextPage(int limit, UUID tenantId, UUID customerId, UUID idOffset);
} }

43
dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java

@ -58,34 +58,35 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
@Override @Override
public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) { public List<WidgetsBundle> findSystemWidgetsBundles(TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(
return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesFirstPage(pageLink.getLimit(), widgetsBundleRepository
pageLink.getTextSearch(), NULL_UUID)); .findSystemWidgetsBundles(
} else { pageLink.getLimit(),
return DaoUtil.convertDataList(widgetsBundleRepository.findSystemWidgetsBundlesNextPage(pageLink.getLimit(), NULL_UUID,
pageLink.getTextSearch(), pageLink.getIdOffset(), NULL_UUID)); pageLink.getTextSearch(),
} pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
@Override @Override
public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { public List<WidgetsBundle> findTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(
return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(), widgetsBundleRepository
tenantId, pageLink.getTextSearch())); .findTenantWidgetsBundlesByTenantId(
} else { pageLink.getLimit(),
return DaoUtil.convertDataList(widgetsBundleRepository.findTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(), tenantId,
tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); pageLink.getTextSearch(),
} pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
@Override @Override
public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) { public List<WidgetsBundle> findAllTenantWidgetsBundlesByTenantId(UUID tenantId, TextPageLink pageLink) {
if (pageLink.getIdOffset() == null) { return DaoUtil.convertDataList(
return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdFirstPage(pageLink.getLimit(), widgetsBundleRepository
tenantId, pageLink.getTextSearch())); .findAllTenantWidgetsBundlesByTenantId(
} else { pageLink.getLimit(),
return DaoUtil.convertDataList(widgetsBundleRepository.findAllTenantWidgetsBundlesByTenantIdNextPage(pageLink.getLimit(), tenantId,
tenantId, pageLink.getTextSearch(), pageLink.getIdOffset())); NULL_UUID,
} pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
} }
} }

54
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity;
import java.util.List; import java.util.List;
@ -31,33 +32,28 @@ public interface WidgetsBundleRepository extends CrudRepository<WidgetsBundleEnt
WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias); WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?3 " + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :systemTenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
"ORDER BY ID LIMIT ?1") "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<WidgetsBundleEntity> findSystemWidgetsBundlesFirstPage(Integer limit, String searchText, UUID tenantId); List<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("limit") int limit,
@Param("systemTenantId") UUID systemTenantId,
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?4 " + @Param("searchText") String searchText,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?2, '%')) " + @Param("idOffset") UUID idOffset);
"AND ID > ?3 ORDER BY ID LIMIT ?1")
List<WidgetsBundleEntity> findSystemWidgetsBundlesNextPage(Integer limit, String searchText, UUID idOffset, UUID tenantId); @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " + "AND ID > :idOffset ORDER BY ID LIMIT :limit")
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
"ORDER BY ID LIMIT ?1") @Param("tenantId") UUID tenantId,
List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); @Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = ?2 " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
"AND ID > ?4 ORDER BY ID LIMIT ?1") "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset); "AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE (TENANT_ID IS NULL OR TENANT_ID = ?2) " + @Param("tenantId") UUID tenantId,
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " + @Param("nullTenantId") UUID nullTenantId,
"ORDER BY ID LIMIT ?1") @Param("textSearch") String textSearch,
List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdFirstPage(int limit, UUID tenantId, String textSearch); @Param("idOffset") 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, '%')) " +
"AND ID > ?4 ORDER BY ID LIMIT ?1")
List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
} }

3
dao/src/test/java/org/thingsboard/server/dao/AbstractJpaDaoTest.java

@ -32,7 +32,8 @@ import org.springframework.test.context.support.DirtiesContextTestExecutionListe
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JpaDaoConfig.class, JpaDbunitTestConfig.class}) @ContextConfiguration(classes = {JpaDaoConfig.class, JpaDbunitTestConfig.class})
@TestPropertySource("classpath:jpa-test.properties") @TestPropertySource("classpath:jpa-test.properties")
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, @TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
DbUnitTestExecutionListener.class }) DbUnitTestExecutionListener.class })
@DbUnitConfiguration(databaseConnection = "dbUnitDatabaseConnection") @DbUnitConfiguration(databaseConnection = "dbUnitDatabaseConnection")

2
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 com.fasterxml.jackson.databind.node.TextNode;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.test.annotation.DirtiesContext; 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"}) @TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:application-test.properties"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@Configuration @Configuration
@EnableAutoConfiguration
@ComponentScan("org.thingsboard.server") @ComponentScan("org.thingsboard.server")
public abstract class AbstractServiceTest { public abstract class AbstractServiceTest {

3
dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java

@ -15,8 +15,6 @@
*/ */
package org.thingsboard.server.dao.sql.alarm; 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 com.google.common.util.concurrent.ListenableFuture;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; 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.AlarmId;
import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.id.DeviceId; 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.common.data.id.TenantId;
import org.thingsboard.server.dao.AbstractJpaDaoTest; import org.thingsboard.server.dao.AbstractJpaDaoTest;
import org.thingsboard.server.dao.alarm.AlarmDao; import org.thingsboard.server.dao.alarm.AlarmDao;

Loading…
Cancel
Save