Browse Source

Native-query changed to JPA

pull/152/head
Volodymyr Babak 9 years ago
parent
commit
6206d5fcb2
  1. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
  2. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmEntity.java
  3. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AssetEntity.java
  4. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
  5. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
  6. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
  7. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java
  8. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
  9. 4
      dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java
  10. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java
  11. 8
      dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java
  12. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
  13. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
  14. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
  15. 7
      dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
  16. 16
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
  17. 16
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
  18. 58
      dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java
  19. 26
      dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java
  20. 25
      dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
  21. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
  22. 13
      dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
  23. 9
      dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
  24. 29
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
  25. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
  26. 59
      dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java
  27. 29
      dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java
  28. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java
  29. 25
      dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java
  30. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java
  31. 25
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java
  32. 8
      dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java
  33. 13
      dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java
  34. 33
      dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/JpaTimeseriesDao.java
  35. 15
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
  36. 14
      dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
  37. 20
      dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
  38. 37
      dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
  39. 3
      dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java
  40. 6
      dao/src/test/resources/jpa-test.properties

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java

@ -47,7 +47,7 @@ public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
private String key;
@Type(type = "json")
@Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY, columnDefinition = "json")
@Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY)
private JsonNode jsonValue;
public AdminSettingsEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmEntity.java

@ -82,7 +82,7 @@ public final class AlarmEntity implements BaseEntity<Alarm> {
private Long clearTs;
@Type(type = "json")
@Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY)
private JsonNode details;
@Column(name = ALARM_PROPAGATE_PROPERTY)

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/AssetEntity.java

@ -62,7 +62,7 @@ public final class AssetEntity implements SearchTextEntity<Asset> {
private String searchText;
@Type(type = "json")
@Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public AssetEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java

@ -58,7 +58,7 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc
private String clazz;
@Type(type = "json")
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY)
private JsonNode configurationDescriptor;
@Column(name = ModelConstants.COMPONENT_DESCRIPTOR_ACTIONS_PROPERTY)

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java

@ -77,7 +77,7 @@ public final class CustomerEntity implements SearchTextEntity<Customer> {
private String email;
@Type(type = "json")
@Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public CustomerEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java

@ -57,7 +57,7 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
private String searchText;
@Type(type = "json")
@Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY)
private JsonNode configuration;
public DashboardEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java

@ -60,7 +60,7 @@ public final class DeviceEntity implements SearchTextEntity<Device> {
private String searchText;
@Type(type = "json")
@Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public DeviceEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java

@ -63,7 +63,7 @@ public class EventEntity implements BaseEntity<Event> {
private String eventUid;
@Type(type = "json")
@Column(name = EVENT_BODY_PROPERTY, columnDefinition = "json")
@Column(name = EVENT_BODY_PROPERTY)
private JsonNode body;
public EventEntity(Event event) {

4
dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java

@ -63,11 +63,11 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
private ComponentLifecycleState state;
@Type(type = "json")
@Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY)
private JsonNode configuration;
@Type(type = "json")
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java

@ -62,7 +62,7 @@ public final class RelationEntity implements ToData<EntityRelation> {
private String relationType;
@Type(type = "json")
@Column(name = ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public RelationEntity() {

8
dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java

@ -64,19 +64,19 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
private String pluginToken;
@Type(type = "json")
@Column(name = ModelConstants.RULE_FILTERS, columnDefinition = "json")
@Column(name = ModelConstants.RULE_FILTERS)
private JsonNode filters;
@Type(type = "json")
@Column(name = ModelConstants.RULE_PROCESSOR, columnDefinition = "json")
@Column(name = ModelConstants.RULE_PROCESSOR)
private JsonNode processor;
@Type(type = "json")
@Column(name = ModelConstants.RULE_ACTION, columnDefinition = "json")
@Column(name = ModelConstants.RULE_ACTION)
private JsonNode action;
@Type(type = "json")
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public RuleMetaDataEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java

@ -76,7 +76,7 @@ public final class TenantEntity implements SearchTextEntity<Tenant> {
private String email;
@Type(type="json")
@Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public TenantEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java

@ -70,7 +70,7 @@ public class UserEntity implements SearchTextEntity<User> {
private String lastName;
@Type(type="json")
@Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY)
private JsonNode additionalInfo;
public UserEntity() {

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java

@ -56,7 +56,7 @@ public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
private String name;
@Type(type="json")
@Column(name = ModelConstants.WIDGET_TYPE_DESCRIPTOR_PROPERTY, columnDefinition = "json")
@Column(name = ModelConstants.WIDGET_TYPE_DESCRIPTOR_PROPERTY)
private JsonNode descriptor;
public WidgetTypeEntity() {

7
dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java

@ -51,9 +51,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
private String searchText;
@Column(name = ModelConstants.WIDGETS_BUNDLE_IMAGE_PROPERTY)
private byte[] image;
public WidgetsBundleEntity() {
super();
}
@ -67,9 +64,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
}
this.alias = widgetsBundle.getAlias();
this.title = widgetsBundle.getTitle();
if (widgetsBundle.getImage() != null) {
this.image = widgetsBundle.getImage();
}
}
@Override
@ -101,7 +95,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
}
widgetsBundle.setAlias(alias);
widgetsBundle.setTitle(title);
widgetsBundle.setImage(image);
return widgetsBundle;
}
}

16
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java

@ -15,12 +15,15 @@
*/
package org.thingsboard.server.dao.sql.alarm;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.dao.annotation.SqlDao;
import org.thingsboard.server.dao.model.sql.AlarmEntity;
import java.util.List;
import java.util.UUID;
/**
@ -29,10 +32,11 @@ import java.util.UUID;
@SqlDao
public interface AlarmRepository extends CrudRepository<AlarmEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = :tenantId AND ORIGINATOR_ID = :originatorId " +
"AND ORIGINATOR_TYPE = :entityType AND TYPE = :alarmType ORDER BY TYPE ASC, ID DESC LIMIT 1")
AlarmEntity findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId,
@Param("originatorId") UUID originatorId,
@Param("entityType") int entityType,
@Param("alarmType") String alarmType);
@Query("SELECT a FROM AlarmEntity a WHERE a.tenantId = :tenantId AND a.originatorId = :originatorId " +
"AND a.originatorType = :entityType AND a.type = :alarmType ORDER BY a.type ASC, a.id DESC")
List<AlarmEntity> findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId,
@Param("originatorId") UUID originatorId,
@Param("entityType") EntityType entityType,
@Param("alarmType") String alarmType,
Pageable pageable);
}

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

@ -21,6 +21,7 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@ -74,12 +75,15 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
@Override
@Transactional(propagation = REQUIRES_NEW)
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
return service.submit(() ->
DaoUtil.getData(alarmRepository.findLatestByOriginatorAndType(
tenantId.getId(),
originator.getId(),
originator.getEntityType().ordinal(),
type)));
return service.submit(() -> {
List<AlarmEntity> latest = alarmRepository.findLatestByOriginatorAndType(
tenantId.getId(),
originator.getId(),
originator.getEntityType(),
type,
new PageRequest(0, 1));
return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0));
});
}
@Override

58
dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java

@ -15,6 +15,8 @@
*/
package org.thingsboard.server.dao.sql.asset;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -31,23 +33,23 @@ import java.util.UUID;
@SqlDao
public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND a.id > :idOffset ORDER BY a.id")
List<AssetEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = :customerId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND a.customerId = :customerId " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND a.id > :idOffset ORDER BY a.id")
List<AssetEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds);
@ -55,27 +57,27 @@ public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
AssetEntity findByTenantIdAndName(UUID tenantId, String name);
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantIdAndType(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND a.type = :type " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND a.id > :idOffset ORDER BY a.id")
List<AssetEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = :customerId AND TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
"AND a.customerId = :customerId AND a.type = :type " +
"AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND a.id > :idOffset ORDER BY a.id")
List<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@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("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();
}

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

@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.asset;
import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.asset.Asset;
@ -29,6 +30,7 @@ import org.thingsboard.server.dao.model.sql.AssetEntity;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@ -58,10 +60,10 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public List<Asset> findAssetsByTenantId(UUID tenantId, TextPageLink pageLink) {
return DaoUtil.convertDataList(assetRepository
.findByTenantId(
pageLink.getLimit(),
tenantId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -74,11 +76,11 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public List<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
return DaoUtil.convertDataList(assetRepository
.findByTenantIdAndCustomerId(
pageLink.getLimit(),
tenantId,
customerId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -97,23 +99,23 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
public List<Asset> findAssetsByTenantIdAndType(UUID tenantId, String type, TextPageLink pageLink) {
return DaoUtil.convertDataList(assetRepository
.findByTenantIdAndType(
pageLink.getLimit(),
tenantId,
type,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
public List<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) {
return DaoUtil.convertDataList(assetRepository
.findByTenantIdAndCustomerIdAndType(
pageLink.getLimit(),
tenantId,
customerId,
type,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override

25
dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.component;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -32,22 +33,22 @@ public interface ComponentDescriptorRepository extends CrudRepository<ComponentD
ComponentDescriptorEntity findByClazz(String clazz);
@Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<ComponentDescriptorEntity> findByType(@Param("limit") int limit,
@Param("type") String type,
@Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type " +
"AND LOWER(cd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND cd.id > :idOffset ORDER BY cd.id")
List<ComponentDescriptorEntity> findByType(@Param("type") String type,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
"AND SCOPE = :scope AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<ComponentDescriptorEntity> findByScopeAndType(@Param("limit") int limit,
@Param("type") String type,
@Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type " +
"AND cd.scope = :scope AND LOWER(cd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND cd.id > :idOffset ORDER BY cd.id")
List<ComponentDescriptorEntity> findByScopeAndType(@Param("type") String type,
@Param("scope") String scope,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
void deleteByClazz(String clazz);
}

14
dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java

@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.component;
import com.datastax.driver.core.utils.UUIDs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.ComponentDescriptorId;
@ -31,6 +32,7 @@ import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@ -83,21 +85,21 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp
public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
return DaoUtil.convertDataList(componentDescriptorRepository
.findByType(
pageLink.getLimit(),
type.toString(),
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
return DaoUtil.convertDataList(componentDescriptorRepository
.findByScopeAndType(
pageLink.getLimit(),
type.toString(),
scope.toString(),
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override

13
dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.customer;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -30,13 +31,13 @@ import java.util.UUID;
@SqlDao
public interface CustomerRepository extends CrudRepository<CustomerEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<CustomerEntity> findByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT c FROM CustomerEntity c WHERE c.tenantId = :tenantId " +
"AND LOWER(c.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND c.id > :idOffset ORDER BY c.id")
List<CustomerEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);

9
dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java

@ -16,6 +16,7 @@
package org.thingsboard.server.dao.sql.customer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Customer;
@ -27,6 +28,7 @@ import org.thingsboard.server.dao.model.sql.CustomerEntity;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@ -54,8 +56,11 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus
@Override
public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
return DaoUtil.convertDataList(customerRepository.findByTenantId(pageLink.getLimit(), tenantId,
pageLink.getTextSearch(), pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
return DaoUtil.convertDataList(customerRepository.findByTenantId(
tenantId,
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override

29
dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.dashboard;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -30,20 +31,20 @@ import java.util.UUID;
@SqlDao
public interface DashboardInfoRepository extends CrudRepository<DashboardInfoEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DashboardInfoEntity> findByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " +
"AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
"AND di.id > :idOffset ORDER BY di.id")
List<DashboardInfoEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("searchText") String searchText,
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = :customerId AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " +
"AND di.customerId = :customerId AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
"AND di.id > :idOffset ORDER BY di.id")
List<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("searchText") String searchText,
@Param("idOffset") UUID idOffset,
Pageable pageable);
}

14
dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java

@ -16,6 +16,7 @@
package org.thingsboard.server.dao.sql.dashboard;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DashboardInfo;
@ -27,6 +28,7 @@ import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -55,20 +57,20 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE
public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
return DaoUtil.convertDataList(dashboardInfoRepository
.findByTenantId(
pageLink.getLimit(),
tenantId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
return DaoUtil.convertDataList(dashboardInfoRepository
.findByTenantIdAndCustomerId(
pageLink.getLimit(),
tenantId,
customerId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
}

59
dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.device;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -32,47 +33,47 @@ import java.util.UUID;
public interface DeviceRepository extends CrudRepository<DeviceEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = :customerId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DeviceEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND d.customerId = :customerId " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
"AND d.id > :idOffset ORDER BY d.id")
List<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DeviceEntity> findByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND d.id > :idOffset ORDER BY d.id")
List<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
"AND TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DeviceEntity> findByTenantIdAndType(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND d.type = :type " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND d.id > :idOffset ORDER BY d.id")
List<DeviceEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
@Param("type") String type,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = :customerId " +
"AND TYPE = :type " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
"AND d.customerId = :customerId " +
"AND d.type = :type " +
"AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND d.id > :idOffset ORDER BY d.id")
List<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("type") String type,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(value = "SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d")
@Query("SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d")
List<TenantDeviceTypeEntity> findTenantDeviceTypes();
DeviceEntity findByTenantIdAndName(UUID tenantId, String name);

29
dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java

@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.device;
import com.google.common.util.concurrent.ListenableFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Device;
@ -58,11 +59,10 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public List<Device> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) {
return DaoUtil.convertDataList(
deviceRepository.findByTenantId(
pageLink.getLimit(),
tenantId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
);
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -74,12 +74,11 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public List<Device> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
return DaoUtil.convertDataList(
deviceRepository.findByTenantIdAndCustomerId(
pageLink.getLimit(),
tenantId,
customerId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
);
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -98,25 +97,23 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
public List<Device> findDevicesByTenantIdAndType(UUID tenantId, String type, TextPageLink pageLink) {
return DaoUtil.convertDataList(
deviceRepository.findByTenantIdAndType(
pageLink.getLimit(),
tenantId,
type,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
);
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
public List<Device> findDevicesByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) {
return DaoUtil.convertDataList(
deviceRepository.findByTenantIdAndCustomerIdAndType(
pageLink.getLimit(),
tenantId,
customerId,
type,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
);
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override

14
dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java

@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.plugin;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.PluginId;
@ -31,6 +32,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -96,10 +98,10 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
log.debug("Try to find plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<PluginMetaDataEntity> entities = pluginMetaDataRepository
.findByTenantIdAndPageLink(
pageLink.getLimit(),
tenantId.getId(),
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit()));
if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else {
@ -113,11 +115,11 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
List<PluginMetaDataEntity> entities = pluginMetaDataRepository
.findAllTenantPluginsByTenantId(
pageLink.getLimit(),
tenantId,
NULL_UUID,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit()));
if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else {

25
dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.plugin;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -32,20 +33,20 @@ public interface PluginMetaDataRepository extends CrudRepository<PluginMetaDataE
PluginMetaDataEntity findByApiToken(String apiToken);
@Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<PluginMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT pmd FROM PluginMetaDataEntity pmd WHERE pmd.tenantId = :tenantId " +
"AND LOWER(pmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND pmd.id > :idOffset ORDER BY pmd.id")
List<PluginMetaDataEntity> findByTenantIdAndPageLink(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT pmd FROM PluginMetaDataEntity pmd WHERE pmd.tenantId IN (:tenantId, :nullTenantId) " +
"AND LOWER(pmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND pmd.id > :idOffset ORDER BY pmd.id")
List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(@Param("tenantId") UUID tenantId,
@Param("nullTenantId") UUID nullTenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
}

14
dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java

@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.rule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.RuleId;
@ -31,6 +32,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -73,10 +75,10 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
List<RuleMetaDataEntity> entities =
ruleMetaDataRepository
.findByTenantIdAndPageLink(
pageLink.getLimit(),
tenantId.getId(),
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit()));
if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
} else {
@ -91,11 +93,11 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
List<RuleMetaDataEntity> entities =
ruleMetaDataRepository
.findAllTenantRulesByTenantId(
pageLink.getLimit(),
tenantId,
NULL_UUID,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit()));
if (log.isTraceEnabled()) {
log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));

25
dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.rule;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -32,20 +33,20 @@ public interface RuleMetaDataRepository extends CrudRepository<RuleMetaDataEntit
List<RuleMetaDataEntity> findByPluginToken(String pluginToken);
@Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<RuleMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT rmd FROM RuleMetaDataEntity rmd WHERE rmd.tenantId = :tenantId " +
"AND LOWER(rmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND rmd.id > :idOffset ORDER BY rmd.id")
List<RuleMetaDataEntity> findByTenantIdAndPageLink(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<RuleMetaDataEntity> findAllTenantRulesByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT rmd FROM RuleMetaDataEntity rmd WHERE rmd.tenantId IN (:tenantId, :nullTenantId) " +
"AND LOWER(rmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND rmd.id > :idOffset ORDER BY rmd.id")
List<RuleMetaDataEntity> findAllTenantRulesByTenantId(@Param("tenantId") UUID tenantId,
@Param("nullTenantId") UUID nullTenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
}

8
dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java

@ -16,6 +16,7 @@
package org.thingsboard.server.dao.sql.tenant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.Tenant;
@ -27,6 +28,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import org.thingsboard.server.dao.tenant.TenantDao;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -55,9 +57,9 @@ public class JpaTenantDao extends JpaAbstractSearchTextDao<TenantEntity, Tenant>
public List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink) {
return DaoUtil.convertDataList(tenantRepository
.findByRegionNextPage(
pageLink.getLimit(),
region,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
}

13
dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.tenant;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -30,11 +31,11 @@ import java.util.UUID;
@SqlDao
public interface TenantRepository extends CrudRepository<TenantEntity, UUID> {
@Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = :region " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<TenantEntity> findByRegionNextPage(@Param("limit") int limit,
@Param("region") String region,
@Query("SELECT t FROM TenantEntity t WHERE t.region = :region " +
"AND LOWER(t.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND t.id > :idOffset ORDER BY t.id")
List<TenantEntity> findByRegionNextPage(@Param("region") String region,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
}

33
dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/JpaTimeseriesDao.java

@ -15,12 +15,15 @@
*/
package org.thingsboard.server.dao.sql.timeseries;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.kv.Aggregation;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.kv.TsKvQuery;
import org.thingsboard.server.dao.DaoUtil;
@ -31,7 +34,9 @@ import org.thingsboard.server.dao.model.sql.TsKvLatestEntity;
import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
import org.thingsboard.server.dao.timeseries.TimeseriesDao;
import javax.annotation.Nullable;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
@ -46,12 +51,34 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp
@Override
public ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, List<TsKvQuery> queries) {
// TODO - Add implementation
return service.submit(() -> null);
List<ListenableFuture<List<TsKvEntry>>> futures = queries
.stream()
.map(query -> findAllAsync(entityId, query))
.collect(Collectors.toList());
return Futures.transform(Futures.allAsList(futures), new Function<List<List<TsKvEntry>>, List<TsKvEntry>>() {
@Nullable
@Override
public List<TsKvEntry> apply(@Nullable List<List<TsKvEntry>> results) {
if (results == null || results.isEmpty()) {
return null;
}
return results.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
}
}, service);
}
private ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, TsKvQuery query) {
return null;
if (query.getAggregation() == Aggregation.NONE) {
return findAllAsyncWithLimit(entityId, query);
} else {
return service.submit(() -> null);
}
}
private ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(EntityId entityId, TsKvQuery query) {
return service.submit(() -> null);
}
@Override

15
dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java

@ -16,6 +16,7 @@
package org.thingsboard.server.dao.sql.user;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.User;
@ -24,11 +25,11 @@ import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.annotation.SqlDao;
import org.thingsboard.server.dao.model.sql.UserEntity;
import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import org.thingsboard.server.dao.user.UserDao;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -66,9 +67,9 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
tenantId,
NULL_UUID,
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
pageLink.getTextSearch(),
Authority.TENANT_ADMIN.name(),
pageLink.getLimit()));
Objects.toString(pageLink.getTextSearch(), ""),
Authority.TENANT_ADMIN,
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -79,9 +80,9 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
tenantId,
customerId,
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
pageLink.getTextSearch(),
Authority.CUSTOMER_USER.name(),
pageLink.getLimit()));
Objects.toString(pageLink.getTextSearch(), ""),
Authority.CUSTOMER_USER,
new PageRequest(0, pageLink.getLimit())));
}
}

14
dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java

@ -15,9 +15,11 @@
*/
package org.thingsboard.server.dao.sql.user;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.dao.annotation.SqlDao;
import org.thingsboard.server.dao.model.sql.UserEntity;
@ -32,15 +34,15 @@ public interface UserRepository extends CrudRepository<UserEntity, UUID> {
UserEntity findByEmail(String email);
@Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " +
"AND CUSTOMER_ID = :customerId AND AUTHORITY = :authority " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%'))" +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
@Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " +
"AND u.customerId = :customerId AND u.authority = :authority " +
"AND LOWER(u.searchText) LIKE LOWER(CONCAT(:searchText, '%'))" +
"AND u.id > :idOffset ORDER BY u.id")
List<UserEntity> findUsersByAuthority(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("idOffset") UUID idOffset,
@Param("searchText") String searchText,
@Param("authority") String authority,
@Param("limit") int limit);
@Param("authority") Authority authority,
Pageable pageable);
}

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

@ -16,6 +16,7 @@
package org.thingsboard.server.dao.sql.widget;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.page.TextPageLink;
@ -27,6 +28,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
import org.thingsboard.server.dao.widget.WidgetsBundleDao;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@ -61,10 +63,10 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
return DaoUtil.convertDataList(
widgetsBundleRepository
.findSystemWidgetsBundles(
pageLink.getLimit(),
NULL_UUID,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -72,10 +74,10 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
return DaoUtil.convertDataList(
widgetsBundleRepository
.findTenantWidgetsBundlesByTenantId(
pageLink.getLimit(),
tenantId,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
@Override
@ -83,10 +85,10 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
return DaoUtil.convertDataList(
widgetsBundleRepository
.findAllTenantWidgetsBundlesByTenantId(
pageLink.getLimit(),
tenantId,
NULL_UUID,
pageLink.getTextSearch(),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
new PageRequest(0, pageLink.getLimit())));
}
}

37
dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java

@ -15,6 +15,7 @@
*/
package org.thingsboard.server.dao.sql.widget;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
@ -32,28 +33,28 @@ public interface WidgetsBundleRepository extends CrudRepository<WidgetsBundleEnt
WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :systemTenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("limit") int limit,
@Param("systemTenantId") UUID systemTenantId,
@Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :systemTenantId " +
"AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
"AND wb.id > :idOffset ORDER BY wb.id")
List<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId,
@Param("searchText") String searchText,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :tenantId " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :tenantId " +
"AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND wb.id > :idOffset ORDER BY wb.id")
List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
"AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND ID > :idOffset ORDER BY ID LIMIT :limit")
List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
@Param("tenantId") UUID tenantId,
@Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId IN (:tenantId, :nullTenantId) " +
"AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND wb.id > :idOffset ORDER BY wb.id")
List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId,
@Param("nullTenantId") UUID nullTenantId,
@Param("textSearch") String textSearch,
@Param("idOffset") UUID idOffset);
@Param("idOffset") UUID idOffset,
Pageable pageable);
}

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

@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.alarm;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmId;
@ -59,7 +60,7 @@ public class JpaAlarmDaoTest extends AbstractJpaDaoTest {
saveAlarm(alarm3Id, tenantId, originator2Id, "TEST_ALARM");
assertEquals(3, alarmDao.find().size());
AlarmEntity alarmEntity = alarmRepository.findLatestByOriginatorAndType(
tenantId, originator1Id, EntityType.DEVICE.ordinal(), "TEST_ALARM");
tenantId, originator1Id, EntityType.DEVICE, "TEST_ALARM", new PageRequest(0, 1)).get(0);
assertNotNull(alarmEntity);
ListenableFuture<Alarm> future = alarmDao
.findLatestByOriginatorAndType(new TenantId(tenantId), new DeviceId(originator1Id), "TEST_ALARM");

6
dao/src/test/resources/jpa-test.properties

@ -7,4 +7,8 @@ spring.jpa.hibernate.ddl-auto=validate
spring.datasource.url=jdbc:postgresql://localhost:5432/thingsboard
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.password=postgres
#spring.datasource.url=jdbc:h2:mem:test;MODE=PostgreSQL
#spring.datasource.schema=classpath:postgres/schema.sql
#spring.datasource.data=classpath:postgres/system-data.sql;classpath:system-test.sql
Loading…
Cancel
Save