Browse Source

Code review fixes

pull/1094/head
Volodymyr Babak 8 years ago
parent
commit
b40b8c8e9f
  1. 33
      application/src/main/data/upgrade/2.1.1/schema_update.cql
  2. 2
      application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java
  3. 4
      application/src/main/java/org/thingsboard/server/service/install/DefaultDataUpdateService.java
  4. 10
      application/src/main/java/org/thingsboard/server/service/security/AccessValidator.java
  5. 44
      application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java
  6. 4
      common/data/src/main/java/org/thingsboard/server/common/data/EntityView.java
  7. 5
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  8. 49
      dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java
  9. 25
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java
  10. 22
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java
  11. 48
      dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewServiceImpl.java
  12. 6
      dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java
  13. 11
      dao/src/main/java/org/thingsboard/server/dao/model/nosql/EntityViewEntity.java
  14. 17
      dao/src/main/java/org/thingsboard/server/dao/model/sql/EntityViewEntity.java
  15. 28
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java
  16. 31
      dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java
  17. 5
      dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
  18. 26
      dao/src/main/resources/cassandra/schema.cql
  19. 2
      dao/src/test/resources/sql/drop-all-tables.sql

33
application/src/main/data/upgrade/2.1.1/schema_update.cql

@ -14,10 +14,9 @@
-- limitations under the License. -- limitations under the License.
-- --
DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_name; DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_view_by_tenant_and_name;
DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_entity; DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_view_by_tenant_and_search_text;
DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_customer; DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_view_by_tenant_and_customer;
DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity;
DROP TABLE IF EXISTS thingsboard.entity_views; 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) 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 * SELECT *
from thingsboard.entity_views from thingsboard.entity_views
WHERE tenant_id IS NOT NULL 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) PRIMARY KEY (tenant_id, search_text, id, customer_id, entity_id)
WITH CLUSTERING ORDER BY (search_text ASC, id DESC, customer_id DESC); 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 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
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
SELECT * SELECT *
from thingsboard.entity_views from thingsboard.entity_views
WHERE tenant_id IS NOT NULL 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 AND id IS NOT NULL
PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id)
WITH CLUSTERING ORDER BY (customer_id DESC, search_text ASC, id DESC); 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);

2
application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java

@ -93,8 +93,6 @@ public class ThingsboardInstallService {
databaseUpgradeService.upgradeDatabase("2.0.0"); databaseUpgradeService.upgradeDatabase("2.0.0");
dataUpdateService.updateData("2.0.0");
log.info("Updating system data..."); log.info("Updating system data...");
systemDataLoaderService.deleteSystemWidgetBundle("charts"); systemDataLoaderService.deleteSystemWidgetBundle("charts");

4
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 ..."); log.info("Updating data from version 1.4.0 to 2.0.0 ...");
tenantsDefaultRuleChainUpdater.updateEntities(null); tenantsDefaultRuleChainUpdater.updateEntities(null);
break; break;
case "2.0.0":
log.info("Updating data from version 2.0.0 to 2.1.1 ...");
tenantsDefaultRuleChainUpdater.updateEntities(null);
break;
default: default:
throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion); throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion);
} }

10
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.Tenant;
import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.exception.ThingsboardException; 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.RuleChain;
import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.server.controller.HttpValidationCallback; import org.thingsboard.server.controller.HttpValidationCallback;

44
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.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; 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.id.CustomerId;
import org.thingsboard.server.common.data.objects.AttributesEntityView; import org.thingsboard.server.common.data.objects.AttributesEntityView;
import org.thingsboard.server.common.data.objects.TelemetryEntityView; 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.common.data.security.Authority;
import org.thingsboard.server.dao.model.ModelConstants; 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.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ -43,7 +50,6 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
private Tenant savedTenant; private Tenant savedTenant;
private User tenantAdmin; private User tenantAdmin;
private Device testDevice; private Device testDevice;
private TelemetryEntityView obj;
@Before @Before
public void beforeTest() throws Exception { public void beforeTest() throws Exception {
@ -67,14 +73,6 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
device.setName("Test device"); device.setName("Test device");
device.setType("default"); device.setType("default");
testDevice = doPost("/api/device", device, Device.class); 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 @After
@ -239,14 +237,16 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk());
} }
TextPageData<EntityView> pageData = doGetTypedWithPageLink(urlTemplate, TextPageData<EntityView> pageData = doGetTypedWithPageLink(urlTemplate,
new TypeReference<TextPageData<EntityView>>(){}, new TextPageLink(4, name1)); new TypeReference<TextPageData<EntityView>>() {
}, new TextPageLink(4, name1));
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size()); Assert.assertEquals(0, pageData.getData().size());
for (EntityView view : loadedNamesOfView2) { for (EntityView view : loadedNamesOfView2) {
doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk());
} }
pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference<TextPageData<EntityView>>(){}, pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference<TextPageData<EntityView>>() {
},
new TextPageLink(4, name2)); new TextPageLink(4, name2));
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size()); 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()); doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk());
} }
TextPageData<EntityView> pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", TextPageData<EntityView> pageData = doGetTypedWithPageLink("/api/tenant/entityViews?",
new TypeReference<TextPageData<EntityView>>(){}, new TextPageLink(4, name1)); new TypeReference<TextPageData<EntityView>>() {
}, new TextPageLink(4, name1));
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size()); Assert.assertEquals(0, pageData.getData().size());
for (EntityView view : loadedNamesOfView2) { for (EntityView view : loadedNamesOfView2) {
doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk());
} }
pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", new TypeReference<TextPageData<EntityView>>(){}, pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", new TypeReference<TextPageData<EntityView>>() {
},
new TextPageLink(4, name2)); new TextPageLink(4, name2));
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size()); Assert.assertEquals(0, pageData.getData().size());
@ -305,7 +307,14 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
view.setEntityId(testDevice.getId()); view.setEntityId(testDevice.getId());
view.setTenantId(savedTenant.getId()); view.setTenantId(savedTenant.getId());
view.setName(name); 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); return doPost("/api/entityView", view, EntityView.class);
} }
@ -346,7 +355,8 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes
List<EntityView> loadedItems = new ArrayList<>(); List<EntityView> loadedItems = new ArrayList<>();
TextPageData<EntityView> pageData; TextPageData<EntityView> pageData;
do { do {
pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference<TextPageData<EntityView>>(){}, pageLink); pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference<TextPageData<EntityView>>() {
}, pageLink);
loadedItems.addAll(pageData.getData()); loadedItems.addAll(pageData.getData());
if (pageData.hasNext()) { if (pageData.hasNext()) {
pageLink = pageData.getNextPageLink(); pageLink = pageData.getNextPageLink();

4
common/data/src/main/java/org/thingsboard/server/common/data/EntityView.java

@ -15,7 +15,9 @@
*/ */
package org.thingsboard.server.common.data; 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.CustomerId;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.EntityViewId;

5
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.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.entity.AbstractEntityService; 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.DataValidationException;
import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.exception.IncorrectParameterException;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
@ -69,6 +70,9 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
@Autowired @Autowired
private DeviceService deviceService; private DeviceService deviceService;
@Autowired
private EntityViewService entityViewService;
@Autowired @Autowired
private DashboardService dashboardService; private DashboardService dashboardService;
@ -113,6 +117,7 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
dashboardService.unassignCustomerDashboards(customerId); dashboardService.unassignCustomerDashboards(customerId);
assetService.unassignCustomerAssets(customer.getTenantId(), customerId); assetService.unassignCustomerAssets(customer.getTenantId(), customerId);
deviceService.unassignCustomerDevices(customer.getTenantId(), customerId); deviceService.unassignCustomerDevices(customer.getTenantId(), customerId);
entityViewService.unassignCustomerEntityViews(customer.getTenantId(), customerId);
userService.deleteCustomerUsers(customer.getTenantId(), customerId); userService.deleteCustomerUsers(customer.getTenantId(), customerId);
deleteEntityRelations(customerId); deleteEntityRelations(customerId);
customerDao.removeById(customerId.getId()); customerDao.removeById(customerId.getId());

49
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.nosql.CassandraAbstractSearchTextDao;
import org.thingsboard.server.dao.util.NoSqlDao; 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.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select; 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. * Created by Victor Basanets on 9/06/2017.
@ -84,19 +96,6 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao<Entit
return Optional.ofNullable(DaoUtil.getData(findOneByStatement(query))); return Optional.ofNullable(DaoUtil.getData(findOneByStatement(query)));
} }
@Override
public List<EntityView> findEntityViewByTenantIdAndEntityId(UUID tenantId, UUID entityId, TextPageLink pageLink) {
log.debug("Try to find entity views by tenantId [{}], entityId [{}] and pageLink [{}]",
tenantId, entityId, pageLink);
List<EntityViewEntity> 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 @Override
public List<EntityView> findEntityViewsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) { public List<EntityView> findEntityViewsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
log.debug("Try to find entity views by tenantId [{}], customerId[{}] and pageLink [{}]", log.debug("Try to find entity views by tenantId [{}], customerId[{}] and pageLink [{}]",
@ -110,26 +109,6 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao<Entit
return DaoUtil.convertDataList(entityViewEntities); return DaoUtil.convertDataList(entityViewEntities);
} }
@Override
public List<EntityView> 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<EntityViewEntity> 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 @Override
public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) { public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) {
log.debug("Try to find entity views by tenantId [{}] and entityId [{}]", tenantId, entityId); log.debug("Try to find entity views by tenantId [{}] and entityId [{}]", tenantId, entityId);

25
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewDao.java

@ -56,18 +56,6 @@ public interface EntityViewDao extends Dao<EntityView> {
*/ */
Optional<EntityView> findEntityViewByTenantIdAndName(UUID tenantId, String name); Optional<EntityView> 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<EntityView> findEntityViewByTenantIdAndEntityId(UUID tenantId,
UUID entityId,
TextPageLink pageLink);
/** /**
* Find entity views by tenantId, customerId and page link. * Find entity views by tenantId, customerId and page link.
* *
@ -80,19 +68,6 @@ public interface EntityViewDao extends Dao<EntityView> {
UUID customerId, UUID customerId,
TextPageLink pageLink); 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<EntityView> findEntityViewsByTenantIdAndCustomerIdAndEntityId(UUID tenantId,
UUID customerId,
UUID entityId,
TextPageLink pageLink);
ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId); ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId);
} }

22
dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewService.java

@ -16,14 +16,12 @@
package org.thingsboard.server.dao.entityview; package org.thingsboard.server.dao.entityview;
import com.google.common.util.concurrent.ListenableFuture; 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.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.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.TextPageData;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
@ -36,8 +34,6 @@ public interface EntityViewService {
EntityView findEntityViewById(EntityViewId entityViewId); EntityView findEntityViewById(EntityViewId entityViewId);
EntityView findEntityViewByTenantIdAndName(TenantId tenantId, String name);
EntityView saveEntityView(EntityView entityView); EntityView saveEntityView(EntityView entityView);
EntityView assignEntityViewToCustomer(EntityViewId entityViewId, CustomerId customerId); EntityView assignEntityViewToCustomer(EntityViewId entityViewId, CustomerId customerId);
@ -48,19 +44,11 @@ public interface EntityViewService {
TextPageData<EntityView> findEntityViewByTenantId(TenantId tenantId, TextPageLink pageLink); TextPageData<EntityView> findEntityViewByTenantId(TenantId tenantId, TextPageLink pageLink);
TextPageData<EntityView> findEntityViewByTenantIdAndEntityId(TenantId tenantId, EntityId entityId, void deleteEntityViewsByTenantId(TenantId tenantId);
TextPageLink pageLink);
void deleteEntityViewByTenantId(TenantId tenantId);
TextPageData<EntityView> findEntityViewsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageData<EntityView> findEntityViewsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId,
TextPageLink pageLink); TextPageLink pageLink);
TextPageData<EntityView> findEntityViewsByTenantIdAndCustomerIdAndEntityId(TenantId tenantId,
CustomerId customerId,
EntityId entityId,
TextPageLink pageLink);
void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId); void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId);
ListenableFuture<EntityView> findEntityViewByIdAsync(EntityViewId entityViewId); ListenableFuture<EntityView> findEntityViewByIdAsync(EntityViewId entityViewId);

48
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()); 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}") @CacheEvict(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityView.tenantId, #entityView.name}")
@Override @Override
public EntityView saveEntityView(EntityView entityView) { public EntityView saveEntityView(EntityView entityView) {
@ -187,24 +178,8 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti
} }
@Override @Override
public TextPageData<EntityView> findEntityViewByTenantIdAndEntityId(TenantId tenantId, EntityId entityId, public void deleteEntityViewsByTenantId(TenantId tenantId) {
TextPageLink pageLink) { log.trace("Executing deleteEntityViewsByTenantId, tenantId [{}]", tenantId);
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<EntityView> 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);
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
tenantEntityViewRemover.removeEntities(tenantId); tenantEntityViewRemover.removeEntities(tenantId);
} }
@ -225,25 +200,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti
return new TextPageData<>(entityViews, pageLink); return new TextPageData<>(entityViews, pageLink);
} }
@Override
public TextPageData<EntityView> 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<EntityView> entityViews = entityViewDao.findEntityViewsByTenantIdAndCustomerIdAndEntityId(
tenantId.getId(), customerId.getId(), entityId.getId(), pageLink);
return new TextPageData<>(entityViews, pageLink);
}
@Override @Override
public void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId) { public void unassignCustomerEntityViews(TenantId tenantId, CustomerId customerId) {
log.trace("Executing unassignCustomerEntityViews, tenantId [{}], customerId [{}]", tenantId, customerId); log.trace("Executing unassignCustomerEntityViews, tenantId [{}], customerId [{}]", tenantId, customerId);

6
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_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY;
public static final String ENTITY_VIEW_CUSTOMER_ID_PROPERTY = CUSTOMER_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_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_view_by_tenant_and_customer";
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_KEYS_PROPERTY = "keys"; 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_START_TS_PROPERTY = "start_ts";
public static final String ENTITY_VIEW_END_TS_PROPERTY = "end_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_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_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_NAME = "entity_view_by_tenant_and_name";
public static final String ENTITY_VIEW_BY_TENANT_AND_ENTITY_AND_SEARCH_TEXT = "entity_view_by_tenant_and_entity";
/** /**
* Cassandra audit log constants. * Cassandra audit log constants.

11
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.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.Type; import org.hibernate.annotations.Type;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView; 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.common.data.objects.TelemetryEntityView;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity; 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) @Table(name = ENTITY_VIEW_TABLE_FAMILY_NAME)
@EqualsAndHashCode @EqualsAndHashCode
@ToString @ToString
@Slf4j
public class EntityViewEntity implements SearchTextEntity<EntityView> { public class EntityViewEntity implements SearchTextEntity<EntityView> {
@PartitionKey(value = 0) @PartitionKey(value = 0)
@ -112,7 +117,7 @@ public class EntityViewEntity implements SearchTextEntity<EntityView> {
try { try {
this.keys = mapper.writeValueAsString(entityView.getKeys()); this.keys = mapper.writeValueAsString(entityView.getKeys());
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error("Unable to serialize entity view keys!", e);
} }
this.startTs = entityView.getStartTimeMs(); this.startTs = entityView.getStartTimeMs();
this.endTs = entityView.getEndTimeMs(); this.endTs = entityView.getEndTimeMs();
@ -142,7 +147,7 @@ public class EntityViewEntity implements SearchTextEntity<EntityView> {
try { try {
entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class)); entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error("Unable to read entity view keys!", e);
} }
entityView.setStartTimeMs(startTs); entityView.setStartTimeMs(startTs);
entityView.setEndTimeMs(endTs); entityView.setEndTimeMs(endTs);

17
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 com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.Type; import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef; import org.hibernate.annotations.TypeDef;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView; 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.common.data.objects.TelemetryEntityView;
import org.thingsboard.server.dao.model.BaseSqlEntity; import org.thingsboard.server.dao.model.BaseSqlEntity;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.model.SearchTextEntity; import org.thingsboard.server.dao.model.SearchTextEntity;
import org.thingsboard.server.dao.util.mapping.JsonStringType; 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 java.io.IOException;
import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_TYPE_PROPERTY; 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 @Entity
@TypeDef(name = "json", typeClass = JsonStringType.class) @TypeDef(name = "json", typeClass = JsonStringType.class)
@Table(name = ModelConstants.ENTITY_VIEW_TABLE_FAMILY_NAME) @Table(name = ModelConstants.ENTITY_VIEW_TABLE_FAMILY_NAME)
@Slf4j
public class EntityViewEntity extends BaseSqlEntity<EntityView> implements SearchTextEntity<EntityView> { public class EntityViewEntity extends BaseSqlEntity<EntityView> implements SearchTextEntity<EntityView> {
@Column(name = ModelConstants.ENTITY_VIEW_ENTITY_ID_PROPERTY) @Column(name = ModelConstants.ENTITY_VIEW_ENTITY_ID_PROPERTY)
@ -103,7 +112,7 @@ public class EntityViewEntity extends BaseSqlEntity<EntityView> implements Searc
try { try {
this.keys = mapper.writeValueAsString(entityView.getKeys()); this.keys = mapper.writeValueAsString(entityView.getKeys());
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error("Unable to serialize entity view keys!", e);
} }
this.startTs = entityView.getStartTimeMs(); this.startTs = entityView.getStartTimeMs();
this.endTs = entityView.getEndTimeMs(); this.endTs = entityView.getEndTimeMs();
@ -139,7 +148,7 @@ public class EntityViewEntity extends BaseSqlEntity<EntityView> implements Searc
try { try {
entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class)); entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error("Unable to read entity view keys!", e);
} }
entityView.setStartTimeMs(startTs); entityView.setStartTimeMs(startTs);
entityView.setEndTimeMs(endTs); entityView.setEndTimeMs(endTs);

28
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/EntityViewRepository.java

@ -40,16 +40,6 @@ public interface EntityViewRepository extends CrudRepository<EntityViewEntity, S
@Param("idOffset") String idOffset, @Param("idOffset") String idOffset,
Pageable pageable); Pageable pageable);
@Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " +
"AND e.entityId = :entityId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND e.id > :idOffset ORDER BY e.id")
List<EntityViewEntity> 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 " + @Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " +
"AND e.customerId = :customerId " + "AND e.customerId = :customerId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " + "AND LOWER(e.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
@ -60,25 +50,7 @@ public interface EntityViewRepository extends CrudRepository<EntityViewEntity, S
@Param("idOffset") String idOffset, @Param("idOffset") String idOffset,
Pageable pageable); Pageable pageable);
@Query("SELECT e FROM EntityViewEntity e WHERE e.tenantId = :tenantId " +
"AND e.customerId = :customerId " +
"AND e.entityId = :entityId " +
"AND LOWER(e.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
"AND e.id > :idOffset ORDER BY e.id")
List<EntityViewEntity> 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); EntityViewEntity findByTenantIdAndName(String tenantId, String name);
List<EntityViewEntity> findAllByTenantIdAndCustomerIdAndIdIn(String tenantId,
String customerId,
List<String> entityViewsIds);
List<EntityViewEntity> findAllByTenantIdAndIdIn(String tenantId, List<String> entityViewsIds);
List<EntityViewEntity> findAllByTenantIdAndEntityId(String tenantId, String entityId); List<EntityViewEntity> findAllByTenantIdAndEntityId(String tenantId, String entityId);
} }

31
dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java

@ -53,7 +53,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
implements EntityViewDao { implements EntityViewDao {
@Autowired @Autowired
EntityViewRepository entityViewRepository; private EntityViewRepository entityViewRepository;
@Override @Override
protected Class<EntityViewEntity> getEntityClass() { protected Class<EntityViewEntity> getEntityClass() {
@ -81,19 +81,6 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
DaoUtil.getData(entityViewRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name))); DaoUtil.getData(entityViewRepository.findByTenantIdAndName(fromTimeUUID(tenantId), name)));
} }
@Override
public List<EntityView> 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 @Override
public List<EntityView> findEntityViewsByTenantIdAndCustomerId(UUID tenantId, public List<EntityView> findEntityViewsByTenantIdAndCustomerId(UUID tenantId,
UUID customerId, UUID customerId,
@ -108,22 +95,6 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
)); ));
} }
@Override
public List<EntityView> 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 @Override
public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) { public ListenableFuture<List<EntityView>> findEntityViewsByTenantIdAndEntityIdAsync(UUID tenantId, UUID entityId) {
return service.submit(() -> DaoUtil.convertDataList( return service.submit(() -> DaoUtil.convertDataList(

5
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.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.entity.AbstractEntityService; 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.DataValidationException;
import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.rule.RuleChainService;
import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.DataValidator;
@ -63,6 +64,9 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe
@Autowired @Autowired
private DeviceService deviceService; private DeviceService deviceService;
@Autowired
private EntityViewService entityViewService;
@Autowired @Autowired
private WidgetsBundleService widgetsBundleService; private WidgetsBundleService widgetsBundleService;
@ -103,6 +107,7 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe
dashboardService.deleteDashboardsByTenantId(tenantId); dashboardService.deleteDashboardsByTenantId(tenantId);
assetService.deleteAssetsByTenantId(tenantId); assetService.deleteAssetsByTenantId(tenantId);
deviceService.deleteDevicesByTenantId(tenantId); deviceService.deleteDevicesByTenantId(tenantId);
entityViewService.deleteEntityViewsByTenantId(tenantId);
userService.deleteTenantAdmins(tenantId); userService.deleteTenantAdmins(tenantId);
ruleChainService.deleteRuleChainsByTenantId(tenantId); ruleChainService.deleteRuleChainsByTenantId(tenantId);
tenantDao.removeById(tenantId.getId()); tenantDao.removeById(tenantId.getId());

26
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) 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 * SELECT *
from thingsboard.entity_views from thingsboard.entity_views
WHERE tenant_id IS NOT NULL 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) PRIMARY KEY (tenant_id, search_text, id, customer_id, entity_id)
WITH CLUSTERING ORDER BY (search_text ASC, id DESC, customer_id DESC); 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 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
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
SELECT * SELECT *
from thingsboard.entity_views from thingsboard.entity_views
WHERE tenant_id IS NOT NULL 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 AND id IS NOT NULL
PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id)
WITH CLUSTERING ORDER BY (customer_id DESC, search_text ASC, id DESC); 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);

2
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 widgets_bundle;
DROP TABLE IF EXISTS rule_node; DROP TABLE IF EXISTS rule_node;
DROP TABLE IF EXISTS rule_chain; DROP TABLE IF EXISTS rule_chain;
DROP TABLE IF EXISTS entity_views; DROP TABLE IF EXISTS entity_views;

Loading…
Cancel
Save