JPA Dao misc fixes due to test failures
This commit is contained in:
parent
73d6eee4fc
commit
5ab6e886bc
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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<Customer> customerValidator =
|
||||
|
||||
@ -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<Dashboard> dashboardValidator =
|
||||
|
||||
@ -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
|
||||
|
||||
@ -82,15 +82,6 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
|
||||
this.configuration = dashboard.getConfiguration();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setId(UUID id) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSearchTextSource() {
|
||||
return title;
|
||||
@ -101,10 +92,6 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
|
||||
this.searchText = searchText;
|
||||
}
|
||||
|
||||
public String getSearchText() {
|
||||
return searchText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dashboard toData() {
|
||||
Dashboard dashboard = new Dashboard(new DashboardId(id));
|
||||
|
||||
@ -96,10 +96,6 @@ public final class DeviceEntity implements SearchTextEntity<Device> {
|
||||
this.searchText = searchText;
|
||||
}
|
||||
|
||||
public String getSearchText() {
|
||||
return searchText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Device toData() {
|
||||
Device device = new Device(new DeviceId(id));
|
||||
|
||||
@ -99,7 +99,7 @@ public class UserEntity implements SearchTextEntity<User> {
|
||||
|
||||
@Override
|
||||
public String getSearchTextSource() {
|
||||
return searchText;
|
||||
return email;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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<RuleMetaData> ruleValidator =
|
||||
|
||||
@ -25,7 +25,7 @@ public abstract class PaginatedRemover<I, D extends IdBased<?>> {
|
||||
|
||||
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) {
|
||||
|
||||
@ -178,21 +178,21 @@ public class JpaRelationDao extends JpaAbstractDaoListeningExecutorService imple
|
||||
public Predicate toPredicate(Root<RelationEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
|
||||
List<Predicate> 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]));
|
||||
|
||||
@ -31,7 +31,7 @@ import java.util.UUID;
|
||||
@Component
|
||||
@Slf4j
|
||||
@SqlDao
|
||||
public class JpaAdminSettingsDao extends JpaAbstractDao<AdminSettingsEntity, AdminSettings> implements AdminSettingsDao{
|
||||
public class JpaAdminSettingsDao extends JpaAbstractDao<AdminSettingsEntity, AdminSettings> implements AdminSettingsDao {
|
||||
|
||||
@Autowired
|
||||
private AdminSettingsRepository adminSettingsRepository;
|
||||
|
||||
@ -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<UserEntity, User> implements UserDao {
|
||||
public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> implements UserDao {
|
||||
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
@ -60,20 +62,26 @@ public class JpaUserDao extends JpaAbstractDao<UserEntity, User> implements User
|
||||
public List<User> 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<User> 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()));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,18 +33,14 @@ 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 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<UserEntity> 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<UserEntity> findCustomerUsers(@Param("limit") int limit,
|
||||
@Param("tenantId") UUID tenantId,
|
||||
List<UserEntity> findUsersByAuthority(@Param("tenantId") UUID tenantId,
|
||||
@Param("customerId") UUID customerId,
|
||||
@Param("idOffset") UUID idOffset);
|
||||
@Param("idOffset") UUID idOffset,
|
||||
@Param("searchText") String searchText,
|
||||
@Param("authority") String authority,
|
||||
@Param("limit") int limit);
|
||||
|
||||
}
|
||||
@ -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<Tenant> tenantValidator =
|
||||
|
||||
@ -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<User> userValidator =
|
||||
|
||||
@ -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<WidgetsBundle> widgetsBundleValidator =
|
||||
|
||||
@ -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
|
||||
);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<EntityRelation> 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<EntityRelation> 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<EntityRelation> 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<EntityRelation> 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));
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
2
dao/src/test/resources/system-test.sql
Normal file
2
dao/src/test/resources/system-test.sql
Normal file
@ -0,0 +1,2 @@
|
||||
TRUNCATE TABLE plugin;
|
||||
TRUNCATE TABLE rule;
|
||||
Loading…
x
Reference in New Issue
Block a user