From b40b8c8e9f720a92fe00ff55f0d2341710726463 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 18 Sep 2018 23:00:27 +0300 Subject: [PATCH] Code review fixes --- .../main/data/upgrade/2.1.1/schema_update.cql | 33 ++----------- .../install/ThingsboardInstallService.java | 2 - .../install/DefaultDataUpdateService.java | 4 -- .../service/security/AccessValidator.java | 10 +++- .../BaseEntityViewControllerTest.java | 44 ++++++++++------- .../server/common/data/EntityView.java | 4 +- .../dao/customer/CustomerServiceImpl.java | 5 ++ .../entityview/CassandraEntityViewDao.java | 49 ++++++------------- .../server/dao/entityview/EntityViewDao.java | 25 ---------- .../dao/entityview/EntityViewService.java | 22 ++------- .../dao/entityview/EntityViewServiceImpl.java | 48 +----------------- .../server/dao/model/ModelConstants.java | 6 +-- .../dao/model/nosql/EntityViewEntity.java | 11 +++-- .../dao/model/sql/EntityViewEntity.java | 17 +++++-- .../sql/entityview/EntityViewRepository.java | 28 ----------- .../dao/sql/entityview/JpaEntityViewDao.java | 31 +----------- .../server/dao/tenant/TenantServiceImpl.java | 5 ++ dao/src/main/resources/cassandra/schema.cql | 26 +--------- .../test/resources/sql/drop-all-tables.sql | 2 +- 19 files changed, 102 insertions(+), 270 deletions(-) diff --git a/application/src/main/data/upgrade/2.1.1/schema_update.cql b/application/src/main/data/upgrade/2.1.1/schema_update.cql index 888f43c5ad..a633634f60 100644 --- a/application/src/main/data/upgrade/2.1.1/schema_update.cql +++ b/application/src/main/data/upgrade/2.1.1/schema_update.cql @@ -14,10 +14,9 @@ -- limitations under the License. -- -DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_name; -DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_entity; -DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_customer; -DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity; +DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_view_by_tenant_and_name; +DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_view_by_tenant_and_search_text; +DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_view_by_tenant_and_customer; DROP TABLE IF EXISTS thingsboard.entity_views; @@ -36,7 +35,7 @@ CREATE TABLE IF NOT EXISTS thingsboard.entity_views ( PRIMARY KEY (id, entity_id, tenant_id, customer_id) ); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_name AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_name AS SELECT * from thingsboard.entity_views WHERE tenant_id IS NOT NULL @@ -58,18 +57,7 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_sea PRIMARY KEY (tenant_id, search_text, id, customer_id, entity_id) WITH CLUSTERING ORDER BY (search_text ASC, id DESC, customer_id DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_entity AS - SELECT * - from thingsboard.entity_views - WHERE tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND entity_id IS NOT NULL - AND search_text IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, entity_id, search_text, id, customer_id) - WITH CLUSTERING ORDER BY (entity_id ASC, search_text ASC, id DESC, customer_id DESC); - -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_customer AS SELECT * from thingsboard.entity_views WHERE tenant_id IS NOT NULL @@ -79,14 +67,3 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_cu AND id IS NOT NULL PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) WITH CLUSTERING ORDER BY (customer_id DESC, search_text ASC, id DESC); - -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity AS - SELECT * - from thingsboard.entity_views - WHERE tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND entity_id IS NOT NULL - AND search_text IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, entity_id, search_text, id) - WITH CLUSTERING ORDER BY (customer_id DESC, entity_id ASC, search_text ASC, id DESC); diff --git a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java index 347b05409e..5b2dab6bee 100644 --- a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java +++ b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java @@ -93,8 +93,6 @@ public class ThingsboardInstallService { databaseUpgradeService.upgradeDatabase("2.0.0"); - dataUpdateService.updateData("2.0.0"); - log.info("Updating system data..."); systemDataLoaderService.deleteSystemWidgetBundle("charts"); diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultDataUpdateService.java index 0194a5dfd7..5daebcc3c5 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultDataUpdateService.java @@ -49,10 +49,6 @@ public class DefaultDataUpdateService implements DataUpdateService { log.info("Updating data from version 1.4.0 to 2.0.0 ..."); tenantsDefaultRuleChainUpdater.updateEntities(null); break; - case "2.0.0": - log.info("Updating data from version 2.0.0 to 2.1.1 ..."); - tenantsDefaultRuleChainUpdater.updateEntities(null); - break; default: throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion); } diff --git a/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java b/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java index 7f4f23a0ef..eaf1018ff2 100644 --- a/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java +++ b/application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java @@ -30,7 +30,15 @@ import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.exception.ThingsboardException; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.AssetId; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.EntityIdFactory; +import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.common.data.id.RuleChainId; +import org.thingsboard.server.common.data.id.RuleNodeId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.controller.HttpValidationCallback; diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java index 5c62e6ad13..98ca7c244a 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java @@ -22,7 +22,11 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.thingsboard.server.common.data.*; +import org.thingsboard.server.common.data.Customer; +import org.thingsboard.server.common.data.Device; +import org.thingsboard.server.common.data.EntityView; +import org.thingsboard.server.common.data.Tenant; +import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.objects.AttributesEntityView; import org.thingsboard.server.common.data.objects.TelemetryEntityView; @@ -31,7 +35,10 @@ import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.model.ModelConstants; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -43,7 +50,6 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes private Tenant savedTenant; private User tenantAdmin; private Device testDevice; - private TelemetryEntityView obj; @Before public void beforeTest() throws Exception { @@ -67,14 +73,6 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes device.setName("Test device"); device.setType("default"); testDevice = doPost("/api/device", device, Device.class); - obj = new TelemetryEntityView( - Arrays.asList("109L", "209L"), - new AttributesEntityView( - Arrays.asList("caKey1", "caKey2"), - Arrays.asList("saKey1", "saKey2", "saKey3"), - Arrays.asList("shKey1", "shKey2", "shKey3", "shKey4") - ) - ); } @After @@ -239,14 +237,16 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } TextPageData pageData = doGetTypedWithPageLink(urlTemplate, - new TypeReference>(){}, new TextPageLink(4, name1)); + new TypeReference>() { + }, new TextPageLink(4, name1)); Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(0, pageData.getData().size()); for (EntityView view : loadedNamesOfView2) { doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } - pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>(){}, + pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>() { + }, new TextPageLink(4, name2)); Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(0, pageData.getData().size()); @@ -287,14 +287,16 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } TextPageData pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", - new TypeReference>(){}, new TextPageLink(4, name1)); + new TypeReference>() { + }, new TextPageLink(4, name1)); Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(0, pageData.getData().size()); for (EntityView view : loadedNamesOfView2) { doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } - pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", new TypeReference>(){}, + pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", new TypeReference>() { + }, new TextPageLink(4, name2)); Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(0, pageData.getData().size()); @@ -305,7 +307,14 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes view.setEntityId(testDevice.getId()); view.setTenantId(savedTenant.getId()); view.setName(name); - view.setKeys(new TelemetryEntityView(obj)); + + view.setKeys(new TelemetryEntityView( + Arrays.asList("109L", "209L"), + new AttributesEntityView( + Arrays.asList("caKey1", "caKey2"), + Arrays.asList("saKey1", "saKey2", "saKey3"), + Arrays.asList("shKey1", "shKey2", "shKey3", "shKey4")))); + return doPost("/api/entityView", view, EntityView.class); } @@ -346,7 +355,8 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes List loadedItems = new ArrayList<>(); TextPageData pageData; do { - pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>(){}, pageLink); + pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>() { + }, pageLink); loadedItems.addAll(pageData.getData()); if (pageData.hasNext()) { pageLink = pageData.getNextPageLink(); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/EntityView.java b/common/data/src/main/java/org/thingsboard/server/common/data/EntityView.java index b86c605464..25b066d2ef 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/EntityView.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/EntityView.java @@ -15,7 +15,9 @@ */ package org.thingsboard.server.common.data; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityViewId; 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 36b250d218..9d96f3a97a 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 @@ -32,6 +32,7 @@ import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.entity.AbstractEntityService; +import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.service.DataValidator; @@ -69,6 +70,9 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom @Autowired private DeviceService deviceService; + @Autowired + private EntityViewService entityViewService; + @Autowired private DashboardService dashboardService; @@ -113,6 +117,7 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom dashboardService.unassignCustomerDashboards(customerId); assetService.unassignCustomerAssets(customer.getTenantId(), customerId); deviceService.unassignCustomerDevices(customer.getTenantId(), customerId); + entityViewService.unassignCustomerEntityViews(customer.getTenantId(), customerId); userService.deleteCustomerUsers(customer.getTenantId(), customerId); deleteEntityRelations(customerId); customerDao.removeById(customerId.getId()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java index 98f6105646..e866bc89b8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java @@ -30,11 +30,23 @@ import org.thingsboard.server.dao.model.nosql.EntityViewEntity; import org.thingsboard.server.dao.nosql.CassandraAbstractSearchTextDao; import org.thingsboard.server.dao.util.NoSqlDao; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; -import static org.thingsboard.server.dao.model.ModelConstants.*; +import static org.thingsboard.server.dao.model.ModelConstants.CUSTOMER_ID_PROPERTY; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_ID_COLUMN; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_SEARCH_TEXT; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_VIEW_BY_TENANT_AND_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_VIEW_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_VIEW_NAME_PROPERTY; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_VIEW_TABLE_FAMILY_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_VIEW_TENANT_ID_PROPERTY; +import static org.thingsboard.server.dao.model.ModelConstants.TENANT_ID_PROPERTY; /** * Created by Victor Basanets on 9/06/2017. @@ -84,19 +96,6 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao findEntityViewByTenantIdAndEntityId(UUID tenantId, UUID entityId, TextPageLink pageLink) { - log.debug("Try to find entity views by tenantId [{}], entityId [{}] and pageLink [{}]", - tenantId, entityId, pageLink); - List entityViewEntities = findPageWithTextSearch( - ENTITY_VIEW_BY_TENANT_AND_ENTITY_AND_SEARCH_TEXT, - Arrays.asList(eq(CUSTOMER_ID_PROPERTY, entityId), eq(TENANT_ID_PROPERTY, tenantId)), - pageLink); - log.trace("Found entity views [{}] by tenantId [{}], entityId [{}] and pageLink [{}]", - entityViewEntities, tenantId, entityId, pageLink); - return DaoUtil.convertDataList(entityViewEntities); - } - @Override public List findEntityViewsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { log.debug("Try to find entity views by tenantId [{}], customerId[{}] and pageLink [{}]", @@ -110,26 +109,6 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao findEntityViewsByTenantIdAndCustomerIdAndEntityId(UUID tenantId, - UUID customerId, - UUID entityId, - TextPageLink pageLink) { - - log.debug("Try to find entity views by tenantId [{}], customerId [{}], entityId [{}] and pageLink [{}]", - tenantId, customerId, entityId, pageLink); - List entityViewEntities = findPageWithTextSearch( - ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_ENTITY_AND_SEARCH_TEXT, - Arrays.asList( - eq(TENANT_ID_PROPERTY, tenantId), - eq(CUSTOMER_ID_PROPERTY, customerId), - eq(ENTITY_ID_COLUMN, entityId)), - pageLink); - log.trace("Found devices [{}] by tenantId [{}], customerId [{}], entityId [{}] and pageLink [{}]", - entityViewEntities, tenantId, customerId, entityId, pageLink); - return DaoUtil.convertDataList(entityViewEntities); - } - @Override public ListenableFuture> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) { log.debug("Try to find entity views by tenantId [{}] and entityId [{}]", tenantId, entityId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java index be643ef363..742cb92d90 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java @@ -56,18 +56,6 @@ public interface EntityViewDao extends Dao { */ Optional findEntityViewByTenantIdAndName(UUID tenantId, String name); - /** - * Find entity views by tenantId, entityId and page link. - * - * @param tenantId the tenantId - * @param entityId the entityId - * @param pageLink the page link - * @return the list of entity view objects - */ - List findEntityViewByTenantIdAndEntityId(UUID tenantId, - UUID entityId, - TextPageLink pageLink); - /** * Find entity views by tenantId, customerId and page link. * @@ -80,19 +68,6 @@ public interface EntityViewDao extends Dao { UUID customerId, TextPageLink pageLink); - /** - * Find entity views by tenantId, customerId, entityId and page link. - * - * @param tenantId the tenantId - * @param customerId the customerId - * @param entityId the entityId - * @param pageLink the page link - * @return the list of entity view objects - */ - List findEntityViewsByTenantIdAndCustomerIdAndEntityId(UUID tenantId, - UUID customerId, - UUID entityId, - TextPageLink pageLink); ListenableFuture> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java index b9c238a79a..89b7e2f85c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java @@ -16,14 +16,12 @@ package org.thingsboard.server.dao.entityview; import com.google.common.util.concurrent.ListenableFuture; -import org.thingsboard.server.common.data.Device; -import org.thingsboard.server.common.data.EntitySubtype; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityView; -import org.thingsboard.server.common.data.Tenant; -import org.thingsboard.server.common.data.device.DeviceSearchQuery; import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; @@ -36,8 +34,6 @@ public interface EntityViewService { EntityView findEntityViewById(EntityViewId entityViewId); - EntityView findEntityViewByTenantIdAndName(TenantId tenantId, String name); - EntityView saveEntityView(EntityView entityView); EntityView assignEntityViewToCustomer(EntityViewId entityViewId, CustomerId customerId); @@ -48,19 +44,11 @@ public interface EntityViewService { TextPageData findEntityViewByTenantId(TenantId tenantId, TextPageLink pageLink); - TextPageData findEntityViewByTenantIdAndEntityId(TenantId tenantId, EntityId entityId, - TextPageLink pageLink); - - void deleteEntityViewByTenantId(TenantId tenantId); + void deleteEntityViewsByTenantId(TenantId tenantId); TextPageData findEntityViewsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink); - TextPageData findEntityViewsByTenantIdAndCustomerIdAndEntityId(TenantId tenantId, - CustomerId customerId, - EntityId entityId, - TextPageLink pageLink); - void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId); ListenableFuture findEntityViewByIdAsync(EntityViewId entityViewId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java index c13261c003..dd3e61d611 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java @@ -96,15 +96,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti return entityViewDao.findById(entityViewId.getId()); } - @Cacheable(cacheNames = ENTITY_VIEW_CACHE, key = "{#tenantId, #name}") - @Override - public EntityView findEntityViewByTenantIdAndName(TenantId tenantId, String name) { - log.trace("Executing findEntityViewByTenantIdAndName [{}][{}]", tenantId, name); - validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - return entityViewDao.findEntityViewByTenantIdAndName(tenantId.getId(), name) - .orElse(null); - } - @CacheEvict(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityView.tenantId, #entityView.name}") @Override public EntityView saveEntityView(EntityView entityView) { @@ -187,24 +178,8 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti } @Override - public TextPageData findEntityViewByTenantIdAndEntityId(TenantId tenantId, EntityId entityId, - TextPageLink pageLink) { - - log.trace("Executing findEntityViewByTenantIdAndType, tenantId [{}], entityId [{}], pageLink [{}]", - tenantId, entityId, pageLink); - - validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - validateString(entityId.toString(), "Incorrect entityId " + entityId.toString()); - validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); - List entityViews = entityViewDao.findEntityViewByTenantIdAndEntityId(tenantId.getId(), - entityId.getId(), pageLink); - - return new TextPageData<>(entityViews, pageLink); - } - - @Override - public void deleteEntityViewByTenantId(TenantId tenantId) { - log.trace("Executing deleteEntityViewByTenantId, tenantId [{}]", tenantId); + public void deleteEntityViewsByTenantId(TenantId tenantId) { + log.trace("Executing deleteEntityViewsByTenantId, tenantId [{}]", tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId); tenantEntityViewRemover.removeEntities(tenantId); } @@ -225,25 +200,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti return new TextPageData<>(entityViews, pageLink); } - @Override - public TextPageData findEntityViewsByTenantIdAndCustomerIdAndEntityId(TenantId tenantId, - CustomerId customerId, - EntityId entityId, - TextPageLink pageLink) { - - log.trace("Executing findEntityViewsByTenantIdAndCustomerIdAndType, tenantId [{}], customerId [{}]," + - " entityId [{}], pageLink [{}]", tenantId, customerId, entityId, pageLink); - - validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); - validateString(entityId.toString(), "Incorrect entityId " + entityId.toString()); - validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); - List entityViews = entityViewDao.findEntityViewsByTenantIdAndCustomerIdAndEntityId( - tenantId.getId(), customerId.getId(), entityId.getId(), pageLink); - - return new TextPageData<>(entityViews, pageLink); - } - @Override public void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId) { log.trace("Executing unassignCustomerEntityViews, tenantId [{}], customerId [{}]", tenantId, customerId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index 45d0ff9493..9890ff62d3 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -150,15 +150,13 @@ public class ModelConstants { public static final String ENTITY_VIEW_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY; public static final String ENTITY_VIEW_CUSTOMER_ID_PROPERTY = CUSTOMER_ID_PROPERTY; public static final String ENTITY_VIEW_NAME_PROPERTY = DEVICE_NAME_PROPERTY; - public static final String ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_ENTITY_AND_SEARCH_TEXT = "entity_views_by_tenant_and_customer_and_entity"; - public static final String ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_SEARCH_TEXT = "entity_views_by_tenant_and_customer"; + public static final String ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_SEARCH_TEXT = "entity_view_by_tenant_and_customer"; public static final String ENTITY_VIEW_KEYS_PROPERTY = "keys"; public static final String ENTITY_VIEW_START_TS_PROPERTY = "start_ts"; public static final String ENTITY_VIEW_END_TS_PROPERTY = "end_ts"; public static final String ENTITY_VIEW_ADDITIONAL_INFO_PROPERTY = ADDITIONAL_INFO_PROPERTY; public static final String ENTITY_VIEW_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "entity_view_by_tenant_and_search_text"; - public static final String ENTITY_VIEW_BY_TENANT_AND_NAME = "entity_views_by_tenant_and_name"; - public static final String ENTITY_VIEW_BY_TENANT_AND_ENTITY_AND_SEARCH_TEXT = "entity_view_by_tenant_and_entity"; + public static final String ENTITY_VIEW_BY_TENANT_AND_NAME = "entity_view_by_tenant_and_name"; /** * Cassandra audit log constants. diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EntityViewEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EntityViewEntity.java index 79dd497173..eb7f4fe65e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EntityViewEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/nosql/EntityViewEntity.java @@ -24,10 +24,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import lombok.extern.slf4j.Slf4j; import org.hibernate.annotations.Type; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityView; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.EntityIdFactory; +import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.objects.TelemetryEntityView; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.SearchTextEntity; @@ -48,6 +52,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY; @Table(name = ENTITY_VIEW_TABLE_FAMILY_NAME) @EqualsAndHashCode @ToString +@Slf4j public class EntityViewEntity implements SearchTextEntity { @PartitionKey(value = 0) @@ -112,7 +117,7 @@ public class EntityViewEntity implements SearchTextEntity { try { this.keys = mapper.writeValueAsString(entityView.getKeys()); } catch (IOException e) { - e.printStackTrace(); + log.error("Unable to serialize entity view keys!", e); } this.startTs = entityView.getStartTimeMs(); this.endTs = entityView.getEndTimeMs(); @@ -142,7 +147,7 @@ public class EntityViewEntity implements SearchTextEntity { try { entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class)); } catch (IOException e) { - e.printStackTrace(); + log.error("Unable to read entity view keys!", e); } entityView.setStartTimeMs(startTs); entityView.setEndTimeMs(endTs); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/EntityViewEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/EntityViewEntity.java index 96d187cfb6..60f6951b80 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/EntityViewEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/EntityViewEntity.java @@ -20,18 +20,26 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityView; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.EntityIdFactory; +import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.objects.TelemetryEntityView; import org.thingsboard.server.dao.model.BaseSqlEntity; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.SearchTextEntity; import org.thingsboard.server.dao.util.mapping.JsonStringType; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Table; import java.io.IOException; import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_TYPE_PROPERTY; @@ -45,6 +53,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_TYPE_PROPER @Entity @TypeDef(name = "json", typeClass = JsonStringType.class) @Table(name = ModelConstants.ENTITY_VIEW_TABLE_FAMILY_NAME) +@Slf4j public class EntityViewEntity extends BaseSqlEntity implements SearchTextEntity { @Column(name = ModelConstants.ENTITY_VIEW_ENTITY_ID_PROPERTY) @@ -103,7 +112,7 @@ public class EntityViewEntity extends BaseSqlEntity implements Searc try { this.keys = mapper.writeValueAsString(entityView.getKeys()); } catch (IOException e) { - e.printStackTrace(); + log.error("Unable to serialize entity view keys!", e); } this.startTs = entityView.getStartTimeMs(); this.endTs = entityView.getEndTimeMs(); @@ -139,7 +148,7 @@ public class EntityViewEntity extends BaseSqlEntity implements Searc try { entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class)); } catch (IOException e) { - e.printStackTrace(); + log.error("Unable to read entity view keys!", e); } entityView.setStartTimeMs(startTs); entityView.setEndTimeMs(endTs); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java index f1ee3fd272..0f5fdf5fba 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java @@ -40,16 +40,6 @@ public interface EntityViewRepository extends CrudRepository :idOffset ORDER BY e.id") - List findByTenantIdAndEntityId(@Param("tenantId") String tenantId, - @Param("entityId") String entityId, - @Param("textSearch") String textSearch, - @Param("idOffset") String idOffset, - Pageable pageable); - @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " + "AND e.customerId = :customerId " + "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " + @@ -60,25 +50,7 @@ public interface EntityViewRepository extends CrudRepository :idOffset ORDER BY e.id") - List findByTenantIdAndCustomerIdAndEntityId(@Param("tenantId") String tenantId, - @Param("customerId") String customerId, - @Param("entityId") String entityId, - @Param("textSearch") String textSearch, - @Param("idOffset") String idOffset, - Pageable pageable); - EntityViewEntity findByTenantIdAndName(String tenantId, String name); - List findAllByTenantIdAndCustomerIdAndIdIn(String tenantId, - String customerId, - List entityViewsIds); - - List findAllByTenantIdAndIdIn(String tenantId, List entityViewsIds); - List findAllByTenantIdAndEntityId(String tenantId, String entityId); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java index 4ff21ab892..0cd1b2b0d6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java @@ -53,7 +53,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao getEntityClass() { @@ -81,19 +81,6 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao findEntityViewByTenantIdAndEntityId(UUID tenantId, - UUID entityId, - TextPageLink pageLink) { - return DaoUtil.convertDataList( - entityViewRepository.findByTenantIdAndEntityId( - fromTimeUUID(tenantId), - fromTimeUUID(entityId), - Objects.toString(pageLink.getTextSearch(), ""), - pageLink.getIdOffset() == null ? NULL_UUID_STR : fromTimeUUID(pageLink.getIdOffset()), - new PageRequest(0, pageLink.getLimit()))); - } - @Override public List findEntityViewsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, @@ -108,22 +95,6 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao findEntityViewsByTenantIdAndCustomerIdAndEntityId(UUID tenantId, - UUID customerId, - UUID entityId, - TextPageLink pageLink) { - return DaoUtil.convertDataList( - entityViewRepository.findByTenantIdAndCustomerIdAndEntityId( - fromTimeUUID(tenantId), - fromTimeUUID(customerId), - fromTimeUUID(entityId), - Objects.toString(pageLink.getTextSearch(), ""), - pageLink.getIdOffset() == null ? NULL_UUID_STR : fromTimeUUID(pageLink.getIdOffset()), - new PageRequest(0, pageLink.getLimit()) - )); - } - @Override public ListenableFuture> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) { return service.submit(() -> DaoUtil.convertDataList( 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 d92c9410e5..a94e715616 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 @@ -29,6 +29,7 @@ import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.entity.AbstractEntityService; +import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.service.DataValidator; @@ -63,6 +64,9 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe @Autowired private DeviceService deviceService; + @Autowired + private EntityViewService entityViewService; + @Autowired private WidgetsBundleService widgetsBundleService; @@ -103,6 +107,7 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe dashboardService.deleteDashboardsByTenantId(tenantId); assetService.deleteAssetsByTenantId(tenantId); deviceService.deleteDevicesByTenantId(tenantId); + entityViewService.deleteEntityViewsByTenantId(tenantId); userService.deleteTenantAdmins(tenantId); ruleChainService.deleteRuleChainsByTenantId(tenantId); tenantDao.removeById(tenantId.getId()); diff --git a/dao/src/main/resources/cassandra/schema.cql b/dao/src/main/resources/cassandra/schema.cql index 4645420eb8..07cecd0453 100644 --- a/dao/src/main/resources/cassandra/schema.cql +++ b/dao/src/main/resources/cassandra/schema.cql @@ -674,7 +674,7 @@ CREATE TABLE IF NOT EXISTS thingsboard.entity_views ( PRIMARY KEY (id, entity_id, tenant_id, customer_id) ); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_name AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_name AS SELECT * from thingsboard.entity_views WHERE tenant_id IS NOT NULL @@ -696,18 +696,7 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_sea PRIMARY KEY (tenant_id, search_text, id, customer_id, entity_id) WITH CLUSTERING ORDER BY (search_text ASC, id DESC, customer_id DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_entity AS - SELECT * - from thingsboard.entity_views - WHERE tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND entity_id IS NOT NULL - AND search_text IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, entity_id, search_text, id, customer_id) - WITH CLUSTERING ORDER BY (entity_id ASC, search_text ASC, id DESC, customer_id DESC); - -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_customer AS SELECT * from thingsboard.entity_views WHERE tenant_id IS NOT NULL @@ -717,14 +706,3 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_cu AND id IS NOT NULL PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) WITH CLUSTERING ORDER BY (customer_id DESC, search_text ASC, id DESC); - -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity AS - SELECT * - from thingsboard.entity_views - WHERE tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND entity_id IS NOT NULL - AND search_text IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, entity_id, search_text, id) - WITH CLUSTERING ORDER BY (customer_id DESC, entity_id ASC, search_text ASC, id DESC); diff --git a/dao/src/test/resources/sql/drop-all-tables.sql b/dao/src/test/resources/sql/drop-all-tables.sql index ebc04b3938..b1fb72cc07 100644 --- a/dao/src/test/resources/sql/drop-all-tables.sql +++ b/dao/src/test/resources/sql/drop-all-tables.sql @@ -19,4 +19,4 @@ DROP TABLE IF EXISTS widget_type; DROP TABLE IF EXISTS widgets_bundle; DROP TABLE IF EXISTS rule_node; DROP TABLE IF EXISTS rule_chain; -DROP TABLE IF EXISTS entity_views; \ No newline at end of file +DROP TABLE IF EXISTS entity_views;