From 5ab6e886bcd1589961124787cf3233e5d8a0d6d1 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 19 Jun 2017 10:18:51 +0300 Subject: [PATCH] JPA Dao misc fixes due to test failures --- .../server/dao/annotation/NoSqlDao.java | 15 + .../server/dao/annotation/SqlDao.java | 15 + .../server/dao/asset/BaseAssetService.java | 5 +- .../dao/customer/CustomerServiceImpl.java | 2 +- .../dao/dashboard/DashboardServiceImpl.java | 4 +- .../server/dao/device/DeviceServiceImpl.java | 4 +- .../server/dao/model/sql/DashboardEntity.java | 13 - .../server/dao/model/sql/DeviceEntity.java | 4 - .../server/dao/model/sql/UserEntity.java | 2 +- .../server/dao/plugin/BasePluginService.java | 3 +- .../server/dao/rule/BaseRuleService.java | 2 +- .../server/dao/service/PaginatedRemover.java | 2 +- .../dao/sql/relation/JpaRelationDao.java | 10 +- .../dao/sql/settings/JpaAdminSettingsDao.java | 2 +- .../server/dao/sql/user/JpaUserDao.java | 22 +- .../server/dao/sql/user/UserRepository.java | 20 +- .../server/dao/tenant/TenantServiceImpl.java | 2 +- .../server/dao/user/UserServiceImpl.java | 10 +- .../dao/widget/WidgetsBundleServiceImpl.java | 2 +- dao/src/main/resources/postgres/schema.sql | 36 +-- .../dao/service/RelationServiceImplTest.java | 2 - .../dao/service/RelationServiceTest.java | 284 ------------------ dao/src/test/resources/jpa-test.properties | 8 +- dao/src/test/resources/system-test.sql | 2 + 24 files changed, 97 insertions(+), 374 deletions(-) delete mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java create mode 100644 dao/src/test/resources/system-test.sql diff --git a/dao/src/main/java/org/thingsboard/server/dao/annotation/NoSqlDao.java b/dao/src/main/java/org/thingsboard/server/dao/annotation/NoSqlDao.java index f4ec83bbf8..a9092a92c9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/annotation/NoSqlDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/annotation/NoSqlDao.java @@ -1,3 +1,18 @@ +/** + * 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.annotation; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/dao/src/main/java/org/thingsboard/server/dao/annotation/SqlDao.java b/dao/src/main/java/org/thingsboard/server/dao/annotation/SqlDao.java index e5a11b17a3..6d26678378 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/annotation/SqlDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/annotation/SqlDao.java @@ -1,3 +1,18 @@ +/** + * 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.annotation; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java index a6fea21543..7e9f129a10 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java @@ -39,7 +39,6 @@ import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.dao.customer.CustomerDao; import org.thingsboard.server.dao.entity.AbstractEntityService; import org.thingsboard.server.dao.exception.DataValidationException; -import org.thingsboard.server.dao.model.*; import org.thingsboard.server.dao.relation.EntitySearchDirection; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; @@ -150,7 +149,7 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ public void deleteAssetsByTenantId(TenantId tenantId) { log.trace("Executing deleteAssetsByTenantId, tenantId [{}]", tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId); - tenantAssetsRemover.removeEntitites(tenantId); + tenantAssetsRemover.removeEntities(tenantId); } @Override @@ -188,7 +187,7 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ log.trace("Executing unassignCustomerAssets, tenantId [{}], customerId [{}]", tenantId, customerId); validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(customerId, "Incorrect customerId " + customerId); - new CustomerAssetsUnassigner(tenantId).removeEntitites(customerId); + new CustomerAssetsUnassigner(tenantId).removeEntities(customerId); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java index 65eb89f9fc..24d1b8a055 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java @@ -135,7 +135,7 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom public void deleteCustomersByTenantId(TenantId tenantId) { log.trace("Executing deleteCustomersByTenantId, tenantId [{}]", tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); - customersByTenantRemover.removeEntitites(tenantId); + customersByTenantRemover.removeEntities(tenantId); } private DataValidator customerValidator = diff --git a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java index 523f774909..e1b1587f91 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/dashboard/DashboardServiceImpl.java @@ -128,7 +128,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb public void deleteDashboardsByTenantId(TenantId tenantId) { log.trace("Executing deleteDashboardsByTenantId, tenantId [{}]", tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); - tenantDashboardsRemover.removeEntitites(tenantId); + tenantDashboardsRemover.removeEntities(tenantId); } @Override @@ -146,7 +146,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb log.trace("Executing unassignCustomerDashboards, tenantId [{}], customerId [{}]", tenantId, customerId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); Validator.validateId(customerId, "Incorrect customerId " + customerId); - new CustomerDashboardsUnassigner(tenantId).removeEntitites(customerId); + new CustomerDashboardsUnassigner(tenantId).removeEntities(customerId); } private DataValidator dashboardValidator = diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java index 458d30a8b3..7535967196 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java @@ -168,7 +168,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe public void deleteDevicesByTenantId(TenantId tenantId) { log.trace("Executing deleteDevicesByTenantId, tenantId [{}]", tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId); - tenantDevicesRemover.removeEntitites(tenantId); + tenantDevicesRemover.removeEntities(tenantId); } @Override @@ -207,7 +207,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe log.trace("Executing unassignCustomerDevices, tenantId [{}], customerId [{}]", tenantId, customerId); validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(customerId, "Incorrect customerId " + customerId); - new CustomerDevicesUnassigner(tenantId).removeEntitites(customerId); + new CustomerDevicesUnassigner(tenantId).removeEntities(customerId); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java index e7967159f2..82c9fa1722 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java @@ -82,15 +82,6 @@ public final class DashboardEntity implements SearchTextEntity { this.configuration = dashboard.getConfiguration(); } - @Override - public UUID getId() { - return id; - } - - @Override - public void setId(UUID id) { - } - @Override public String getSearchTextSource() { return title; @@ -100,10 +91,6 @@ public final class DashboardEntity implements SearchTextEntity { public void setSearchText(String searchText) { this.searchText = searchText; } - - public String getSearchText() { - return searchText; - } @Override public Dashboard toData() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java index 148e5f163f..02e8c2804a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java @@ -96,10 +96,6 @@ public final class DeviceEntity implements SearchTextEntity { this.searchText = searchText; } - public String getSearchText() { - return searchText; - } - @Override public Device toData() { Device device = new Device(new DeviceId(id)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java index d1a1c71cb1..250d91ba63 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java @@ -99,7 +99,7 @@ public class UserEntity implements SearchTextEntity { @Override public String getSearchTextSource() { - return searchText; + return email; } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java b/dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java index 342ca4aa20..fe9a558ea9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/plugin/BasePluginService.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.dao.plugin; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -223,7 +222,7 @@ public class BasePluginService extends AbstractEntityService implements PluginSe @Override public void deletePluginsByTenantId(TenantId tenantId) { Validator.validateId(tenantId, "Incorrect tenant id for delete plugins request."); - tenantPluginRemover.removeEntitites(tenantId); + tenantPluginRemover.removeEntities(tenantId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java index a5b34a29d1..b356c90e24 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/rule/BaseRuleService.java @@ -265,7 +265,7 @@ public class BaseRuleService extends AbstractEntityService implements RuleServic @Override public void deleteRulesByTenantId(TenantId tenantId) { validateId(tenantId, "Incorrect tenant id for delete rules request."); - tenantRulesRemover.removeEntitites(tenantId); + tenantRulesRemover.removeEntities(tenantId); } private DataValidator ruleValidator = diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java b/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java index 8bdefd967b..c1c89c2992 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/PaginatedRemover.java @@ -25,7 +25,7 @@ public abstract class PaginatedRemover> { private static final int DEFAULT_LIMIT = 100; - public void removeEntitites(I id) { + public void removeEntities(I id) { TextPageLink pageLink = new TextPageLink(DEFAULT_LIMIT); boolean hasNext = true; while (hasNext) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java index 550424c82a..8fca908f85 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/relation/JpaRelationDao.java @@ -178,21 +178,21 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) { List predicates = new ArrayList<>(); if (from != null) { - Predicate fromIdPredicate = criteriaBuilder.equal(root.get(RELATION_FROM_ID_PROPERTY), from.getId()); + Predicate fromIdPredicate = criteriaBuilder.equal(root.get("fromId"), from.getId()); predicates.add(fromIdPredicate); - Predicate fromEntityTypePredicate = criteriaBuilder.equal(root.get(RELATION_FROM_TYPE_PROPERTY), from.getEntityType().name()); + Predicate fromEntityTypePredicate = criteriaBuilder.equal(root.get("fromType"), from.getEntityType().name()); predicates.add(fromEntityTypePredicate); } if (relationType != null) { - Predicate relationTypePredicate = criteriaBuilder.equal(root.get(RELATION_TYPE_PROPERTY), relationType); + Predicate relationTypePredicate = criteriaBuilder.equal(root.get("relationType"), relationType); predicates.add(relationTypePredicate); } if (typeGroup != null) { - Predicate typeGroupPredicate = criteriaBuilder.equal(root.get(RELATION_TYPE_GROUP_PROPERTY), typeGroup); + Predicate typeGroupPredicate = criteriaBuilder.equal(root.get("relationTypeGroup"), typeGroup); predicates.add(typeGroupPredicate); } if (childType != null) { - Predicate childTypePredicate = criteriaBuilder.equal(root.get(RELATION_TO_TYPE_PROPERTY), childType.name()); + Predicate childTypePredicate = criteriaBuilder.equal(root.get("toType"), childType.name()); predicates.add(childTypePredicate); } return criteriaBuilder.and(predicates.toArray(new Predicate[0])); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java index 5433a13337..e4ab2d402d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java @@ -31,7 +31,7 @@ import java.util.UUID; @Component @Slf4j @SqlDao -public class JpaAdminSettingsDao extends JpaAbstractDao implements AdminSettingsDao{ +public class JpaAdminSettingsDao extends JpaAbstractDao implements AdminSettingsDao { @Autowired private AdminSettingsRepository adminSettingsRepository; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java index de2f5f9b5e..d4308cf7b3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java @@ -20,10 +20,12 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.page.TextPageLink; +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; @@ -36,7 +38,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; */ @Component @SqlDao -public class JpaUserDao extends JpaAbstractDao implements UserDao { +public class JpaUserDao extends JpaAbstractSearchTextDao implements UserDao { @Autowired private UserRepository userRepository; @@ -60,20 +62,26 @@ public class JpaUserDao extends JpaAbstractDao implements User public List findTenantAdmins(UUID tenantId, TextPageLink pageLink) { return DaoUtil.convertDataList( userRepository - .findTenantAdmins( - pageLink.getLimit(), + .findUsersByAuthority( tenantId, - pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); + NULL_UUID, + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(), + pageLink.getTextSearch(), + Authority.TENANT_ADMIN.name(), + pageLink.getLimit())); } @Override public List findCustomerUsers(UUID tenantId, UUID customerId, TextPageLink pageLink) { return DaoUtil.convertDataList( userRepository - .findCustomerUsers( - pageLink.getLimit(), + .findUsersByAuthority( tenantId, customerId, - pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())); + pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(), + pageLink.getTextSearch(), + Authority.CUSTOMER_USER.name(), + pageLink.getLimit())); + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java index a0fb882b0b..128f45f4c5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java @@ -33,18 +33,14 @@ public interface UserRepository extends CrudRepository { UserEntity findByEmail(String email); @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " + - "AND CUSTOMER_ID IS NULL AND AUTHORITY = 'TENANT_ADMIN' " + + "AND CUSTOMER_ID = :customerId AND AUTHORITY = :authority " + + "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%'))" + "AND ID > :idOffset ORDER BY ID LIMIT :limit") - List findTenantAdmins(@Param("limit") int limit, - @Param("tenantId") UUID tenantId, - @Param("idOffset") UUID idOffset); - - @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " + - "AND CUSTOMER_ID = :customerId AND AUTHORITY = 'CUSTOMER_USER' " + - "AND ID > :idOffset ORDER BY ID LIMIT :limit") - List findCustomerUsers(@Param("limit") int limit, - @Param("tenantId") UUID tenantId, - @Param("customerId") UUID customerId, - @Param("idOffset") UUID idOffset); + List 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); } \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java index 7645b28b1b..678e811681 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java @@ -119,7 +119,7 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe @Override public void deleteTenants() { log.trace("Executing deleteTenants"); - tenantsRemover.removeEntitites(DEFAULT_TENANT_REGION); + tenantsRemover.removeEntities(DEFAULT_TENANT_REGION); } private DataValidator tenantValidator = diff --git a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java index d8782dbc8c..6b75f62a96 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java @@ -15,14 +15,12 @@ */ package org.thingsboard.server.dao.user; -import static org.thingsboard.server.dao.DaoUtil.getData; import static org.thingsboard.server.dao.service.Validator.validateId; import static org.thingsboard.server.dao.service.Validator.validatePageLink; import static org.thingsboard.server.dao.service.Validator.validateString; import java.util.List; -import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; @@ -48,10 +46,6 @@ import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.tenant.TenantDao; -import java.util.List; - -import static org.thingsboard.server.dao.service.Validator.*; - @Service @Slf4j public class UserServiceImpl extends AbstractEntityService implements UserService { @@ -193,7 +187,7 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic public void deleteTenantAdmins(TenantId tenantId) { log.trace("Executing deleteTenantAdmins, tenantId [{}]", tenantId); validateId(tenantId, "Incorrect tenantId " + tenantId); - tenantAdminsRemover.removeEntitites(tenantId); + tenantAdminsRemover.removeEntities(tenantId); } @Override @@ -211,7 +205,7 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic log.trace("Executing deleteCustomerUsers, customerId [{}]", customerId); validateId(tenantId, "Incorrect tenantId " + tenantId); validateId(customerId, "Incorrect customerId " + customerId); - new CustomerUsersRemover(tenantId).removeEntitites(customerId); + new CustomerUsersRemover(tenantId).removeEntities(customerId); } private DataValidator userValidator = diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java index 9e90acaf3e..de20ff0ada 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java @@ -145,7 +145,7 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService { public void deleteWidgetsBundlesByTenantId(TenantId tenantId) { log.trace("Executing deleteWidgetsBundlesByTenantId, tenantId [{}]", tenantId); Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); - tenantWidgetsBundleRemover.removeEntitites(tenantId); + tenantWidgetsBundleRemover.removeEntities(tenantId); } private DataValidator widgetsBundleValidator = diff --git a/dao/src/main/resources/postgres/schema.sql b/dao/src/main/resources/postgres/schema.sql index da500209b6..3f77e81f42 100644 --- a/dao/src/main/resources/postgres/schema.sql +++ b/dao/src/main/resources/postgres/schema.sql @@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS admin_settings ( id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY, - json_value varchar, + json_value text, key character varying(255) ); @@ -25,7 +25,7 @@ CREATE TABLE IF NOT EXISTS alarm ( id uuid NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY, ack_ts bigint, clear_ts bigint, - additional_info varchar, + additional_info text, end_ts bigint, originator_id uuid, originator_type integer, @@ -39,7 +39,7 @@ CREATE TABLE IF NOT EXISTS alarm ( CREATE TABLE IF NOT EXISTS asset ( id uuid NOT NULL CONSTRAINT asset_pkey PRIMARY KEY, - additional_info varchar, + additional_info text, customer_id uuid, name character varying(255), search_text character varying(255), @@ -64,7 +64,7 @@ CREATE TABLE IF NOT EXISTS component_descriptor ( id uuid NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY, actions character varying(255), clazz character varying(255), - configuration_descriptor varchar, + configuration_descriptor text, name character varying(255), scope character varying(255), search_text character varying(255), @@ -73,7 +73,7 @@ CREATE TABLE IF NOT EXISTS component_descriptor ( CREATE TABLE IF NOT EXISTS customer ( id uuid NOT NULL CONSTRAINT customer_pkey PRIMARY KEY, - additional_info varchar, + additional_info text, address character varying(255), address2 character varying(255), city character varying(255), @@ -89,7 +89,7 @@ CREATE TABLE IF NOT EXISTS customer ( CREATE TABLE IF NOT EXISTS dashboard ( id uuid NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY, - configuration varchar, + configuration text, customer_id uuid, search_text character varying(255), tenant_id uuid, @@ -98,7 +98,7 @@ CREATE TABLE IF NOT EXISTS dashboard ( CREATE TABLE IF NOT EXISTS device ( id uuid NOT NULL CONSTRAINT device_pkey PRIMARY KEY, - additional_info varchar, + additional_info text, customer_id uuid, type character varying(255), name character varying(255), @@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS device_credentials ( CREATE TABLE IF NOT EXISTS event ( id uuid NOT NULL CONSTRAINT event_pkey PRIMARY KEY, - body varchar, + body text, entity_id uuid, entity_type character varying(255), event_type character varying(255), @@ -126,10 +126,10 @@ CREATE TABLE IF NOT EXISTS event ( CREATE TABLE IF NOT EXISTS plugin ( id uuid NOT NULL CONSTRAINT plugin_pkey PRIMARY KEY, - additional_info varchar, + additional_info text, api_token character varying(255), plugin_class character varying(255), - configuration varchar, + configuration text, name character varying(255), public_access boolean, search_text character varying(255), @@ -144,18 +144,18 @@ CREATE TABLE IF NOT EXISTS relation ( to_type character varying(255), relation_type_group character varying(255), relation_type character varying(255), - additional_info varchar, + additional_info text, CONSTRAINT relation_unq_key UNIQUE (from_id, from_type, relation_type_group, relation_type, to_id, to_type) ); CREATE TABLE IF NOT EXISTS rule ( id uuid NOT NULL CONSTRAINT rule_pkey PRIMARY KEY, - action varchar, - additional_info varchar, - filters varchar, + action text, + additional_info text, + filters text, name character varying(255), plugin_token character varying(255), - processor varchar, + processor text, search_text character varying(255), state character varying(255), tenant_id uuid, @@ -164,7 +164,7 @@ CREATE TABLE IF NOT EXISTS rule ( CREATE TABLE IF NOT EXISTS tb_user ( id uuid NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY, - additional_info varchar, + additional_info text, authority character varying(255), customer_id uuid, email character varying(255) UNIQUE, @@ -176,7 +176,7 @@ CREATE TABLE IF NOT EXISTS tb_user ( CREATE TABLE IF NOT EXISTS tenant ( id uuid NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY, - additional_info varchar, + additional_info text, address character varying(255), address2 character varying(255), city character varying(255), @@ -227,7 +227,7 @@ CREATE TABLE IF NOT EXISTS widget_type ( id uuid NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY, alias character varying(255), bundle_alias character varying(255), - descriptor varchar, + descriptor text, name character varying(255), tenant_id uuid ); diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceImplTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceImplTest.java index f7e47ce526..cb1fbc5d36 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceImplTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceImplTest.java @@ -16,13 +16,11 @@ package org.thingsboard.server.dao.service; import com.datastax.driver.core.utils.UUIDs; -import com.google.common.util.concurrent.ListenableFuture; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.relation.EntityRelation; diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java deleted file mode 100644 index 8a082fc1da..0000000000 --- a/dao/src/test/java/org/thingsboard/server/dao/service/RelationServiceTest.java +++ /dev/null @@ -1,284 +0,0 @@ -/** - * 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.service; - -import com.datastax.driver.core.utils.UUIDs; -import com.google.common.util.concurrent.ListenableFuture; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.thingsboard.server.common.data.EntityType; -import org.thingsboard.server.common.data.asset.Asset; -import org.thingsboard.server.common.data.id.AssetId; -import org.thingsboard.server.common.data.id.DeviceId; -import org.thingsboard.server.common.data.relation.EntityRelation; -import org.thingsboard.server.common.data.relation.RelationTypeGroup; -import org.thingsboard.server.dao.exception.DataValidationException; -import org.thingsboard.server.dao.relation.EntityRelationsQuery; -import org.thingsboard.server.dao.relation.EntitySearchDirection; -import org.thingsboard.server.dao.relation.EntityTypeFilter; -import org.thingsboard.server.dao.relation.RelationsSearchParameters; - -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class RelationServiceTest extends AbstractServiceTest { - - @Before - public void before() { - } - - @After - public void after() { - } - - @Test - public void testSaveRelation() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); - - EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); - - Assert.assertTrue(saveRelation(relation)); - - Assert.assertTrue(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - - Assert.assertFalse(relationService.checkRelation(parentId, childId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON).get()); - - Assert.assertFalse(relationService.checkRelation(childId, parentId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - - Assert.assertFalse(relationService.checkRelation(childId, parentId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON).get()); - } - - @Test - public void testDeleteRelation() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); - AssetId subChildId = new AssetId(UUIDs.timeBased()); - - EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); - EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); - - saveRelation(relationA); - saveRelation(relationB); - - Assert.assertTrue(relationService.deleteRelation(relationA).get()); - - Assert.assertFalse(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - - Assert.assertTrue(relationService.checkRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - - Assert.assertTrue(relationService.deleteRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - } - - @Test - public void testDeleteEntityRelations() throws ExecutionException, InterruptedException { - AssetId parentId = new AssetId(UUIDs.timeBased()); - AssetId childId = new AssetId(UUIDs.timeBased()); - AssetId subChildId = new AssetId(UUIDs.timeBased()); - - EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); - EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); - - saveRelation(relationA); - saveRelation(relationB); - - Assert.assertTrue(relationService.deleteEntityRelations(childId).get()); - - Assert.assertFalse(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - - Assert.assertFalse(relationService.checkRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); - } - - @Test - public void testFindFrom() throws ExecutionException, InterruptedException { - AssetId parentA = new AssetId(UUIDs.timeBased()); - AssetId parentB = new AssetId(UUIDs.timeBased()); - AssetId childA = new AssetId(UUIDs.timeBased()); - AssetId childB = new AssetId(UUIDs.timeBased()); - - EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); - EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); - - EntityRelation relationB1 = new EntityRelation(parentB, childA, EntityRelation.MANAGES_TYPE); - EntityRelation relationB2 = new EntityRelation(parentB, childB, EntityRelation.MANAGES_TYPE); - - saveRelation(relationA1); - saveRelation(relationA2); - - saveRelation(relationB1); - saveRelation(relationB2); - - List relations = relationService.findByFrom(parentA, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(2, relations.size()); - for (EntityRelation relation : relations) { - Assert.assertEquals(EntityRelation.CONTAINS_TYPE, relation.getType()); - Assert.assertEquals(parentA, relation.getFrom()); - Assert.assertTrue(childA.equals(relation.getTo()) || childB.equals(relation.getTo())); - } - - relations = relationService.findByFromAndType(parentA, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(2, relations.size()); - - relations = relationService.findByFromAndType(parentA, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(0, relations.size()); - - relations = relationService.findByFrom(parentB, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(2, relations.size()); - for (EntityRelation relation : relations) { - Assert.assertEquals(EntityRelation.MANAGES_TYPE, relation.getType()); - Assert.assertEquals(parentB, relation.getFrom()); - Assert.assertTrue(childA.equals(relation.getTo()) || childB.equals(relation.getTo())); - } - - relations = relationService.findByFromAndType(parentB, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(0, relations.size()); - - relations = relationService.findByFromAndType(parentB, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(0, relations.size()); - } - - private Boolean saveRelation(EntityRelation relationA1) throws ExecutionException, InterruptedException { - return relationService.saveRelation(relationA1).get(); - } - - @Test - public void testFindTo() throws ExecutionException, InterruptedException { - AssetId parentA = new AssetId(UUIDs.timeBased()); - AssetId parentB = new AssetId(UUIDs.timeBased()); - AssetId childA = new AssetId(UUIDs.timeBased()); - AssetId childB = new AssetId(UUIDs.timeBased()); - - EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); - EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); - - EntityRelation relationB1 = new EntityRelation(parentB, childA, EntityRelation.MANAGES_TYPE); - EntityRelation relationB2 = new EntityRelation(parentB, childB, EntityRelation.MANAGES_TYPE); - - saveRelation(relationA1); - saveRelation(relationA2); - - saveRelation(relationB1); - saveRelation(relationB2); - - // Data propagation to views is async - Thread.sleep(3000); - - List relations = relationService.findByTo(childA, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(2, relations.size()); - for (EntityRelation relation : relations) { - Assert.assertEquals(childA, relation.getTo()); - Assert.assertTrue(parentA.equals(relation.getFrom()) || parentB.equals(relation.getFrom())); - } - - relations = relationService.findByToAndType(childA, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(1, relations.size()); - - relations = relationService.findByToAndType(childB, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(1, relations.size()); - - relations = relationService.findByToAndType(parentA, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(0, relations.size()); - - relations = relationService.findByToAndType(parentB, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(0, relations.size()); - - relations = relationService.findByTo(childB, RelationTypeGroup.COMMON).get(); - Assert.assertEquals(2, relations.size()); - for (EntityRelation relation : relations) { - Assert.assertEquals(childB, relation.getTo()); - Assert.assertTrue(parentA.equals(relation.getFrom()) || parentB.equals(relation.getFrom())); - } - } - - @Test - public void testCyclicRecursiveRelation() throws ExecutionException, InterruptedException { - // A -> B -> C -> A - AssetId assetA = new AssetId(UUIDs.timeBased()); - AssetId assetB = new AssetId(UUIDs.timeBased()); - AssetId assetC = new AssetId(UUIDs.timeBased()); - - EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); - EntityRelation relationB = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); - EntityRelation relationC = new EntityRelation(assetC, assetA, EntityRelation.CONTAINS_TYPE); - - saveRelation(relationA); - saveRelation(relationB); - saveRelation(relationC); - - EntityRelationsQuery query = new EntityRelationsQuery(); - query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1)); - query.setFilters(Collections.singletonList(new EntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); - List relations = relationService.findByQuery(query).get(); - Assert.assertEquals(3, relations.size()); - Assert.assertTrue(relations.contains(relationA)); - Assert.assertTrue(relations.contains(relationB)); - Assert.assertTrue(relations.contains(relationC)); - } - - @Test - public void testRecursiveRelation() throws ExecutionException, InterruptedException { - // A -> B -> [C,D] - AssetId assetA = new AssetId(UUIDs.timeBased()); - AssetId assetB = new AssetId(UUIDs.timeBased()); - AssetId assetC = new AssetId(UUIDs.timeBased()); - DeviceId deviceD = new DeviceId(UUIDs.timeBased()); - - EntityRelation relationAB = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); - EntityRelation relationBC = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); - EntityRelation relationBD = new EntityRelation(assetB, deviceD, EntityRelation.CONTAINS_TYPE); - - - saveRelation(relationAB); - saveRelation(relationBC); - saveRelation(relationBD); - - EntityRelationsQuery query = new EntityRelationsQuery(); - query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1)); - query.setFilters(Collections.singletonList(new EntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); - List relations = relationService.findByQuery(query).get(); - Assert.assertEquals(2, relations.size()); - Assert.assertTrue(relations.contains(relationAB)); - Assert.assertTrue(relations.contains(relationBC)); - } - - - @Test(expected = DataValidationException.class) - public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException { - EntityRelation relation = new EntityRelation(); - relation.setTo(new AssetId(UUIDs.timeBased())); - relation.setType(EntityRelation.CONTAINS_TYPE); - Assert.assertTrue(saveRelation(relation)); - } - - @Test(expected = DataValidationException.class) - public void testSaveRelationWithEmptyTo() throws ExecutionException, InterruptedException { - EntityRelation relation = new EntityRelation(); - relation.setFrom(new AssetId(UUIDs.timeBased())); - relation.setType(EntityRelation.CONTAINS_TYPE); - Assert.assertTrue(saveRelation(relation)); - } - - @Test(expected = DataValidationException.class) - public void testSaveRelationWithEmptyType() throws ExecutionException, InterruptedException { - EntityRelation relation = new EntityRelation(); - relation.setFrom(new AssetId(UUIDs.timeBased())); - relation.setTo(new AssetId(UUIDs.timeBased())); - Assert.assertTrue(saveRelation(relation)); - } -} diff --git a/dao/src/test/resources/jpa-test.properties b/dao/src/test/resources/jpa-test.properties index 06a7296e39..58ca25f1c2 100644 --- a/dao/src/test/resources/jpa-test.properties +++ b/dao/src/test/resources/jpa-test.properties @@ -5,8 +5,6 @@ sql.enabled=true spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=validate -spring.datasource.driverClassName=org.h2.Driver -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 - +spring.datasource.url=jdbc:postgresql://localhost:5432/thingsboard +spring.datasource.username=postgres +spring.datasource.password=postgres \ No newline at end of file diff --git a/dao/src/test/resources/system-test.sql b/dao/src/test/resources/system-test.sql new file mode 100644 index 0000000000..57d49ddad9 --- /dev/null +++ b/dao/src/test/resources/system-test.sql @@ -0,0 +1,2 @@ +TRUNCATE TABLE plugin; +TRUNCATE TABLE rule; \ No newline at end of file