From 8ca3e594e8b335a6634e4fc338d9ef3045c3e74c Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Wed, 12 Sep 2018 18:24:45 +0300 Subject: [PATCH 01/12] Was added field wich needed for caching --- application/src/main/resources/thingsboard.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index be5149dcb8..362cc29a9b 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -298,6 +298,9 @@ caffeine: assets: timeToLiveInMinutes: 1440 maxSize: 100000 + entityViews: + timeToLiveInMinutes: 1440 + maxSize: 100000 redis: # standalone or cluster From 9a77b2b1997ce09a36396db94a7f2120be362fd9 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Wed, 12 Sep 2018 18:43:42 +0300 Subject: [PATCH 02/12] Was fixed the cache --- .../dao/entityview/EntityViewServiceImpl.java | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) 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 f5afad6ec9..dada337f61 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 @@ -15,7 +15,6 @@ */ package org.thingsboard.server.dao.entityview; -import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -25,20 +24,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.DataConstants; -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.CustomerId; -import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.TenantId; @@ -58,12 +52,9 @@ import org.thingsboard.server.dao.tenant.TenantDao; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import static org.thingsboard.server.common.data.CacheConstants.DEVICE_CACHE; import static org.thingsboard.server.common.data.CacheConstants.ENTITY_VIEW_CACHE; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; import static org.thingsboard.server.dao.service.Validator.validateId; @@ -97,7 +88,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti @Autowired private CacheManager cacheManager; -// @Cacheable(cacheNames = ENTITY_VIEW_CACHE) + @Cacheable(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityViewId.getId()}") @Override public EntityView findEntityViewById(EntityViewId entityViewId) { log.trace("Executing findEntityViewById [{}]", entityViewId); @@ -105,6 +96,7 @@ 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); @@ -113,7 +105,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti .orElse(null); } -// @CachePut(cacheNames = ENTITY_VIEW_CACHE) + @CacheEvict(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityView.id, #entityView.tenantId, #entityView.name}") @Override public EntityView saveEntityView(EntityView entityView) { log.trace("Executing save entity view [{}]", entityView); @@ -177,14 +169,13 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti @Override public void deleteEntityView(EntityViewId entityViewId) { log.trace("Executing deleteEntityView [{}]", entityViewId); -// Cache cache = cacheManager.getCache(ENTITY_VIEW_CACHE); + Cache cache = cacheManager.getCache(ENTITY_VIEW_CACHE); validateId(entityViewId, INCORRECT_ENTITY_VIEW_ID + entityViewId); deleteEntityRelations(entityViewId); EntityView entityView = entityViewDao.findById(entityViewId.getId()); -// List list = new ArrayList<>(); -// list.add(entityView.getTenantId()); -// list.add(entityView.getName()); -// cache.evict(list); + cache.evict(entityView.getId()); + cache.evict(entityView.getTenantId()); + cache.evict(entityView.getName()); entityViewDao.removeById(entityViewId.getId()); } @@ -197,7 +188,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti return new TextPageData<>(entityViews, pageLink); } -// @Cacheable(cacheNames = ENTITY_VIEW_CACHE) @Override public TextPageData findEntityViewByTenantIdAndEntityId(TenantId tenantId, EntityId entityId, TextPageLink pageLink) { @@ -237,7 +227,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti return new TextPageData<>(entityViews, pageLink); } -// @Cacheable(cacheNames = ENTITY_VIEW_CACHE, key = "{#tenantId, #customerId, #entityId, #pageLink}") @Override public TextPageData findEntityViewsByTenantIdAndCustomerIdAndEntityId(TenantId tenantId, CustomerId customerId, From 3fba214509bcf88f1511ee4c93caa369d56434f8 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Thu, 13 Sep 2018 19:50:49 +0300 Subject: [PATCH 03/12] Was modified values of request mapping annotation --- .../server/controller/EntityViewController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java index b5adc327f5..48dddcb2b5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java @@ -51,7 +51,7 @@ public class EntityViewController extends BaseController { public static final String ENTITY_VIEW_ID = "entityViewId"; @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/entityView/{entityViewId}", method = RequestMethod.GET) + @RequestMapping(value = "/entity-view/{entityViewId}", method = RequestMethod.GET) @ResponseBody public EntityView getEntityViewById(@PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { @@ -66,7 +66,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/entityView", method = RequestMethod.POST) + @RequestMapping(value = "/entity-view", method = RequestMethod.POST) @ResponseBody public EntityView saveEntityView(@RequestBody EntityView entityView) throws ThingsboardException { try { @@ -86,7 +86,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/entityView/{entityViewId}", method = RequestMethod.DELETE) + @RequestMapping(value = "/entity-view/{entityViewId}", method = RequestMethod.DELETE) @ResponseStatus(value = HttpStatus.OK) public void deleteEntityView(@PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { checkParameter(ENTITY_VIEW_ID, strEntityViewId); @@ -107,7 +107,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/customer/{customerId}/entityView/{entityViewId}", method = RequestMethod.POST) + @RequestMapping(value = "/customer/{customerId}/entity-view/{entityViewId}", method = RequestMethod.POST) @ResponseBody public EntityView assignEntityViewToCustomer(@PathVariable("customerId") String strCustomerId, @PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { @@ -136,7 +136,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/customer/entityView/{entityViewId}", method = RequestMethod.DELETE) + @RequestMapping(value = "/customer/entity-view/{entityViewId}", method = RequestMethod.DELETE) @ResponseBody public EntityView unassignEntityViewFromCustomer(@PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { checkParameter(ENTITY_VIEW_ID, strEntityViewId); @@ -164,7 +164,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/customer/{customerId}/entityViews", params = {"limit"}, method = RequestMethod.GET) + @RequestMapping(value = "/customer/{customerId}/entity-views", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TextPageData getCustomerEntityViews( @PathVariable("customerId") String strCustomerId, @@ -185,7 +185,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/tenant/entityViews", params = {"limit"}, method = RequestMethod.GET) + @RequestMapping(value = "/tenant/entity-views", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TextPageData getTenantEntityViews( @RequestParam int limit, @@ -202,7 +202,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/entityViews", method = RequestMethod.POST) + @RequestMapping(value = "/entity-views", method = RequestMethod.POST) @ResponseBody public List findByQuery(@RequestBody EntityViewSearchQuery query) throws ThingsboardException { checkNotNull(query); From 7c14df56e3aa71a5eb9289e080dfff0704cbbb38 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Thu, 13 Sep 2018 19:51:40 +0300 Subject: [PATCH 04/12] Was added new tests --- .../BaseEntityViewControllerTest.java | 275 ++++++++++++++++-- 1 file changed, 244 insertions(+), 31 deletions(-) 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 c7ac98d413..920ce139cc 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java @@ -15,25 +15,34 @@ */ package org.thingsboard.server.controller; +import com.datastax.driver.core.utils.UUIDs; +import com.fasterxml.jackson.core.type.TypeReference; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -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.*; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.objects.AttributesEntityView; import org.thingsboard.server.common.data.objects.TelemetryEntityView; +import org.thingsboard.server.common.data.page.TextPageData; +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.Arrays; +import java.util.*; +import java.util.stream.Stream; +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.view; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; public abstract class BaseEntityViewControllerTest extends AbstractControllerTest { + private IdComparator idComparator; private Tenant savedTenant; private User tenantAdmin; private Device testDevice; @@ -43,6 +52,8 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes public void beforeTest() throws Exception { loginSysAdmin(); + idComparator = new IdComparator<>(); + Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); savedTenant = doPost("/api/tenant", tenant, Tenant.class); @@ -62,13 +73,14 @@ 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", "caKey3"), - Arrays.asList("saKey1", "saKey2", "saKey3", "saKey4"), - Arrays.asList("shKey1", "shKey2", "shKey3", "shKey4", "shKey5"))); + Arrays.asList("caKey1", "caKey2"), + Arrays.asList("saKey1", "saKey2", "saKey3"), + Arrays.asList("shKey1", "shKey2", "shKey3", "shKey4") + ) + ); } @After @@ -81,24 +93,15 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes @Test public void testFindEntityViewById() throws Exception { - EntityView view = new EntityView(); - view.setName("Test entity view"); - view.setEntityId(testDevice.getId()); - view.setKeys(new TelemetryEntityView(obj)); - EntityView savedView = doPost("/api/entity-view", view, EntityView.class); + EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); EntityView foundView = doGet("/api/entity-view/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertNotNull(foundView); Assert.assertEquals(savedView, foundView); } @Test - public void testSaveEntityViewWithIdOfDevice() throws Exception { - EntityView view = new EntityView(); - view.setEntityId(testDevice.getId()); - view.setName("Test entity view"); - view.setTenantId(savedTenant.getId()); - view.setKeys(new TelemetryEntityView(obj)); - EntityView savedView = doPost("/api/entity-view", view, EntityView.class); + public void testSaveEntityView() throws Exception { + EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); Assert.assertNotNull(savedView); Assert.assertNotNull(savedView.getId()); @@ -110,25 +113,235 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes savedView.setName("New test entity view"); doPost("/api/entity-view", savedView, EntityView.class); - - EntityView foundEntityView = doGet("/api/entity-view/" - + savedView.getId().getId().toString(), EntityView.class); + EntityView foundEntityView = doGet("/api/entity-view/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(foundEntityView.getName(), savedView.getName()); } @Test public void testDeleteEntityView() throws Exception { - EntityView view = new EntityView(); - view.setName("Test entity view"); - view.setEntityId(testDevice.getId()); - view.setKeys(new TelemetryEntityView((TelemetryEntityView) obj)); - EntityView savedView = doPost("/api/entity-view", view, EntityView.class); - + EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); doDelete("/api/entity-view/" + savedView.getId().getId().toString()) .andExpect(status().isOk()); - doGet("/api/entity-view/" + savedView.getId().getId().toString()) .andExpect(status().isNotFound()); } + + @Test + public void testSaveEntityViewWithEmptyName() throws Exception { + doPost("/api/entity-view", getNewEntityView("Entity view")) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("Entity-view name should be specified"))); + } + + @Test + public void testAssignAndUnAssignedEntityViewToCustomer() throws Exception { + EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); + Customer savedCustomer = doPost("/api/customer", getNewCustomer("My customer"), Customer.class); + EntityView assignedView = doPost("/api/customer/" + savedCustomer.getId().getId().toString() + + "/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + Assert.assertEquals(savedCustomer.getId(), assignedView.getCustomerId()); + + EntityView foundView = doGet("/api/entity-view" + savedView.getId().getId().toString(), EntityView.class); + Assert.assertEquals(savedCustomer.getId(), foundView.getCustomerId()); + + EntityView unAssignedView = doDelete("/api/customer/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + Assert.assertEquals(ModelConstants.NULL_UUID, unAssignedView.getCustomerId().getId()); + + foundView = doGet("/api/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + Assert.assertEquals(ModelConstants.NULL_UUID, foundView.getCustomerId().getId()); + } + + @Test + public void testAssignEntityViewToNonExistentCustomer() throws Exception { + EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); + doPost("/api/customer/" + UUIDs.timeBased().toString() + "/device/" + savedView.getId().getId().toString()) + .andExpect(status().isNotFound()); + } + + @Test + public void testAssignEntityViewToCustomerFromDifferentTenant() throws Exception { + loginSysAdmin(); + + Tenant savedAnotherTenant = doPost("/api/tenant", getNewTenant("Different tenant"), Tenant.class); + Assert.assertNotNull(savedAnotherTenant); + + User adminAnotherTenant = new User(); + adminAnotherTenant.setAuthority(Authority.TENANT_ADMIN); + adminAnotherTenant.setTenantId(savedAnotherTenant.getId()); + adminAnotherTenant.setEmail("tenant3@thingsboard.org"); + adminAnotherTenant.setFirstName("Joe"); + adminAnotherTenant.setLastName("Downs"); + createUserAndLogin(adminAnotherTenant, "testPassword1"); + + Customer savedCustomer = doPost("/api/customer", getNewCustomer("Different customer"), Customer.class); + login(tenantAdmin.getEmail(), "testPassword1"); + + EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); + doPost("/api/customer/" + savedCustomer.getId().getId().toString() + "/entity-view/" + savedView.getId().getId().toString()) + .andExpect(status().isForbidden()); + + loginSysAdmin(); + + doDelete("/api/tenant/" + savedAnotherTenant.getId().getId().toString()) + .andExpect(status().isOk()); + } + + @Test + public void testGetCustomerEntityViews() throws Exception { + CustomerId customerId = doPost("/api/customer", getNewCustomer("Test customer"), Customer.class).getId(); + String urlTemplate = "/api/customer/" + customerId.getId().toString() + "/entity-views?"; + + List views = new ArrayList<>(); + for (int i = 0; i < 128; i++) { + views.add(doPost("/api/customer/" + customerId.getId().toString() + "/entity-view/" + + getNewEntityView("Test entity view " + i).getId().getId().toString(), EntityView.class)); + } + + List loadedViews = loadListOf(new TextPageLink(23), urlTemplate); + + Collections.sort(views, idComparator); + Collections.sort(loadedViews, idComparator); + + Assert.assertEquals(views, loadedViews); + } + + @Test + public void testGetCustomerEntityViewsByName() throws Exception { + CustomerId customerId = doPost("/api/customer", getNewCustomer("Test customer"), Customer.class).getId(); + String urlTemplate = "/api/customer/" + customerId.getId().toString() + "/entity-views?"; + + String name1 = "Entity view name1"; + List namesOfView1 = fillListOf(125, name1, "/api/customer/" + customerId.getId().toString() + + "/entity-view/"); + List loadedNamesOfView1 = loadListOf(new TextPageLink(15, name1), urlTemplate); + Collections.sort(namesOfView1, idComparator); + Collections.sort(loadedNamesOfView1, idComparator); + Assert.assertEquals(namesOfView1, loadedNamesOfView1); + + String name2 = "Entity view name2"; + List NamesOfView2 = fillListOf(143, name2, "/api/customer/" + customerId.getId().toString() + + "/entity-view/"); + List loadedNamesOfView2 = loadListOf(new TextPageLink(4, name2), urlTemplate); + Collections.sort(NamesOfView2, idComparator); + Collections.sort(loadedNamesOfView2, idComparator); + Assert.assertEquals(NamesOfView2, loadedNamesOfView2); + + for (EntityView view : loadedNamesOfView1) { + doDelete("/api/customer/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + } + TextPageData pageData = doGetTypedWithPageLink(urlTemplate, + new TypeReference>(){}, new TextPageLink(4, name1)); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + + for (EntityView view : loadedNamesOfView2) { + doDelete("/api/customer/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + } + pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>(){}, + new TextPageLink(4, name2)); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + } + + @Test + public void testGetTenantEntityViews() throws Exception { + + List views = new ArrayList<>(); + for (int i = 0; i < 178; i++) { + views.add(doPost("/api/entity-view/", getNewEntityView("Test entity view" + i), EntityView.class)); + } + List loadedViews = loadListOf(new TextPageLink(23), "/api/tenant/entity-views?"); + + Collections.sort(views, idComparator); + Collections.sort(loadedViews, idComparator); + + Assert.assertEquals(views, loadedViews); + } + + @Test + public void testGetTenantEntityViewsByName() throws Exception { + String name1 = "Entity view name1"; + List namesOfView1 = fillListOf(143, name1); + List loadedNamesOfView1 = loadListOf(new TextPageLink(15, name1), "/api/tenant/entity-views?"); + Collections.sort(namesOfView1, idComparator); + Collections.sort(loadedNamesOfView1, idComparator); + Assert.assertEquals(namesOfView1, loadedNamesOfView1); + + String name2 = "Entity view name2"; + List NamesOfView2 = fillListOf(75, name2); + List loadedNamesOfView2 = loadListOf(new TextPageLink(4, name2), "/api/tenant/entity-views?"); + Collections.sort(NamesOfView2, idComparator); + Collections.sort(loadedNamesOfView2, idComparator); + Assert.assertEquals(NamesOfView2, loadedNamesOfView2); + + for (EntityView view : loadedNamesOfView1) { + doDelete("/api/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + } + TextPageData pageData = doGetTypedWithPageLink("/api/tenant/entity-views?", + new TypeReference>(){}, new TextPageLink(4, name1)); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + + for (EntityView view : loadedNamesOfView2) { + doDelete("/api/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + } + pageData = doGetTypedWithPageLink("/api/tenant/entity-views?", new TypeReference>(){}, + new TextPageLink(4, name2)); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + } + + private EntityView getNewEntityView(String name) throws Exception { + EntityView view = new EntityView(); + view.setName(name); + view.setEntityId(testDevice.getId()); + view.setTenantId(savedTenant.getId()); + view.setKeys(new TelemetryEntityView(obj)); + return doPost("/api/entity-view", view, EntityView.class); + } + + private Customer getNewCustomer(String title) { + Customer customer = new Customer(); + customer.setTitle(title); + return customer; + } + + private Tenant getNewTenant(String title) { + Tenant tenant = new Tenant(); + tenant.setTitle(title); + return tenant; + } + + private List fillListOf(int limit, String partOfName, String urlTemplate) throws Exception { + List views = new ArrayList<>(); + for (EntityView view : fillListOf(limit, partOfName)) { + views.add(doPost(urlTemplate + view.getId().getId().toString(), EntityView.class)); + } + return views; + } + + private List fillListOf(int limit, String partOfName) throws Exception { + List viewNames = new ArrayList<>(); + for (int i = 0; i < limit; i++) { + String fullName = partOfName + ' ' + RandomStringUtils.randomAlphanumeric(15); + fullName = i % 2 == 0 ? fullName.toLowerCase() : fullName.toUpperCase(); + viewNames.add(doPost("/api/entity-view", getNewEntityView(fullName), EntityView.class)); + } + return viewNames; + } + + private List loadListOf(TextPageLink pageLink, String urlTemplate) throws Exception { + List loadedItems = new ArrayList<>(); + TextPageData pageData; + do { + pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>(){}, pageLink); + loadedItems.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + return loadedItems; + } } From 5180961ecb4611c23baa2ed079433e62fe3da5d3 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Fri, 14 Sep 2018 15:12:55 +0300 Subject: [PATCH 05/12] Was modified of request mapping values --- .../controller/EntityViewController.java | 16 ++-- .../BaseEntityViewControllerTest.java | 96 ++++++++++--------- 2 files changed, 58 insertions(+), 54 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java index 48dddcb2b5..b5adc327f5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java @@ -51,7 +51,7 @@ public class EntityViewController extends BaseController { public static final String ENTITY_VIEW_ID = "entityViewId"; @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/entity-view/{entityViewId}", method = RequestMethod.GET) + @RequestMapping(value = "/entityView/{entityViewId}", method = RequestMethod.GET) @ResponseBody public EntityView getEntityViewById(@PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { @@ -66,7 +66,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/entity-view", method = RequestMethod.POST) + @RequestMapping(value = "/entityView", method = RequestMethod.POST) @ResponseBody public EntityView saveEntityView(@RequestBody EntityView entityView) throws ThingsboardException { try { @@ -86,7 +86,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/entity-view/{entityViewId}", method = RequestMethod.DELETE) + @RequestMapping(value = "/entityView/{entityViewId}", method = RequestMethod.DELETE) @ResponseStatus(value = HttpStatus.OK) public void deleteEntityView(@PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { checkParameter(ENTITY_VIEW_ID, strEntityViewId); @@ -107,7 +107,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/customer/{customerId}/entity-view/{entityViewId}", method = RequestMethod.POST) + @RequestMapping(value = "/customer/{customerId}/entityView/{entityViewId}", method = RequestMethod.POST) @ResponseBody public EntityView assignEntityViewToCustomer(@PathVariable("customerId") String strCustomerId, @PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { @@ -136,7 +136,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/customer/entity-view/{entityViewId}", method = RequestMethod.DELETE) + @RequestMapping(value = "/customer/entityView/{entityViewId}", method = RequestMethod.DELETE) @ResponseBody public EntityView unassignEntityViewFromCustomer(@PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { checkParameter(ENTITY_VIEW_ID, strEntityViewId); @@ -164,7 +164,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/customer/{customerId}/entity-views", params = {"limit"}, method = RequestMethod.GET) + @RequestMapping(value = "/customer/{customerId}/entityViews", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TextPageData getCustomerEntityViews( @PathVariable("customerId") String strCustomerId, @@ -185,7 +185,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAuthority('TENANT_ADMIN')") - @RequestMapping(value = "/tenant/entity-views", params = {"limit"}, method = RequestMethod.GET) + @RequestMapping(value = "/tenant/entityViews", params = {"limit"}, method = RequestMethod.GET) @ResponseBody public TextPageData getTenantEntityViews( @RequestParam int limit, @@ -202,7 +202,7 @@ public class EntityViewController extends BaseController { } @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") - @RequestMapping(value = "/entity-views", method = RequestMethod.POST) + @RequestMapping(value = "/entityViews", method = RequestMethod.POST) @ResponseBody public List findByQuery(@RequestBody EntityViewSearchQuery query) throws ThingsboardException { checkNotNull(query); 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 920ce139cc..b3da7ad6e2 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java @@ -57,7 +57,6 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); savedTenant = doPost("/api/tenant", tenant, Tenant.class); - Assert.assertNotNull(savedTenant); tenantAdmin = new User(); @@ -93,15 +92,15 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes @Test public void testFindEntityViewById() throws Exception { - EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); - EntityView foundView = doGet("/api/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); + EntityView foundView = doGet("/api/entityView/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertNotNull(foundView); Assert.assertEquals(savedView, foundView); } @Test public void testSaveEntityView() throws Exception { - EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); + EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); Assert.assertNotNull(savedView); Assert.assertNotNull(savedView.getId()); @@ -112,49 +111,49 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes Assert.assertEquals(savedView.getName(), savedView.getName()); savedView.setName("New test entity view"); - doPost("/api/entity-view", savedView, EntityView.class); - EntityView foundEntityView = doGet("/api/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + doPost("/api/entityView", savedView, EntityView.class); + EntityView foundEntityView = doGet("/api/entityView/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(foundEntityView.getName(), savedView.getName()); } @Test public void testDeleteEntityView() throws Exception { - EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); - doDelete("/api/entity-view/" + savedView.getId().getId().toString()) + EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); + doDelete("/api/entityView/" + savedView.getId().getId().toString()) .andExpect(status().isOk()); - doGet("/api/entity-view/" + savedView.getId().getId().toString()) + doGet("/api/entityView/" + savedView.getId().getId().toString()) .andExpect(status().isNotFound()); } @Test public void testSaveEntityViewWithEmptyName() throws Exception { - doPost("/api/entity-view", getNewEntityView("Entity view")) + doPost("/api/entityView", getNewEntityView("")) .andExpect(status().isBadRequest()) .andExpect(statusReason(containsString("Entity-view name should be specified"))); } @Test public void testAssignAndUnAssignedEntityViewToCustomer() throws Exception { - EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); + EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); Customer savedCustomer = doPost("/api/customer", getNewCustomer("My customer"), Customer.class); EntityView assignedView = doPost("/api/customer/" + savedCustomer.getId().getId().toString() - + "/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + + "/entityView/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(savedCustomer.getId(), assignedView.getCustomerId()); - EntityView foundView = doGet("/api/entity-view" + savedView.getId().getId().toString(), EntityView.class); + EntityView foundView = doGet("/api/entityView" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(savedCustomer.getId(), foundView.getCustomerId()); - EntityView unAssignedView = doDelete("/api/customer/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + EntityView unAssignedView = doDelete("/api/customer/entityView/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(ModelConstants.NULL_UUID, unAssignedView.getCustomerId().getId()); - foundView = doGet("/api/entity-view/" + savedView.getId().getId().toString(), EntityView.class); + foundView = doGet("/api/entityView/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(ModelConstants.NULL_UUID, foundView.getCustomerId().getId()); } @Test public void testAssignEntityViewToNonExistentCustomer() throws Exception { - EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); + EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); doPost("/api/customer/" + UUIDs.timeBased().toString() + "/device/" + savedView.getId().getId().toString()) .andExpect(status().isNotFound()); } @@ -163,38 +162,43 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes public void testAssignEntityViewToCustomerFromDifferentTenant() throws Exception { loginSysAdmin(); - Tenant savedAnotherTenant = doPost("/api/tenant", getNewTenant("Different tenant"), Tenant.class); - Assert.assertNotNull(savedAnotherTenant); + Tenant tenant2 = getNewTenant("Different tenant"); + Tenant savedTenant2 = doPost("/api/tenant", tenant2, Tenant.class); + Assert.assertNotNull(savedTenant2); + + User tenantAdmin2 = new User(); + tenantAdmin2.setAuthority(Authority.TENANT_ADMIN); + tenantAdmin2.setTenantId(savedTenant2.getId()); + tenantAdmin2.setEmail("tenant3@thingsboard.org"); + tenantAdmin2.setFirstName("Joe"); + tenantAdmin2.setLastName("Downs"); + tenantAdmin2 = createUserAndLogin(tenantAdmin2, "testPassword1"); - User adminAnotherTenant = new User(); - adminAnotherTenant.setAuthority(Authority.TENANT_ADMIN); - adminAnotherTenant.setTenantId(savedAnotherTenant.getId()); - adminAnotherTenant.setEmail("tenant3@thingsboard.org"); - adminAnotherTenant.setFirstName("Joe"); - adminAnotherTenant.setLastName("Downs"); - createUserAndLogin(adminAnotherTenant, "testPassword1"); + Customer customer = getNewCustomer("Different customer"); + Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - Customer savedCustomer = doPost("/api/customer", getNewCustomer("Different customer"), Customer.class); login(tenantAdmin.getEmail(), "testPassword1"); - EntityView savedView = doPost("/api/entity-view", getNewEntityView("Test entity view"), EntityView.class); - doPost("/api/customer/" + savedCustomer.getId().getId().toString() + "/entity-view/" + savedView.getId().getId().toString()) + EntityView view = getNewEntityView("Test entity view"); + EntityView savedView = doPost("/api/entityView", view, EntityView.class); + + doPost("/api/customer/" + savedCustomer.getId().getId().toString() + "/entityView/" + savedView.getId().getId().toString()) .andExpect(status().isForbidden()); loginSysAdmin(); - doDelete("/api/tenant/" + savedAnotherTenant.getId().getId().toString()) + doDelete("/api/tenant/" + savedTenant2.getId().getId().toString()) .andExpect(status().isOk()); } @Test public void testGetCustomerEntityViews() throws Exception { CustomerId customerId = doPost("/api/customer", getNewCustomer("Test customer"), Customer.class).getId(); - String urlTemplate = "/api/customer/" + customerId.getId().toString() + "/entity-views?"; + String urlTemplate = "/api/customer/" + customerId.getId().toString() + "/entityViews?"; List views = new ArrayList<>(); for (int i = 0; i < 128; i++) { - views.add(doPost("/api/customer/" + customerId.getId().toString() + "/entity-view/" + views.add(doPost("/api/customer/" + customerId.getId().toString() + "/entityView/" + getNewEntityView("Test entity view " + i).getId().getId().toString(), EntityView.class)); } @@ -209,11 +213,11 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes @Test public void testGetCustomerEntityViewsByName() throws Exception { CustomerId customerId = doPost("/api/customer", getNewCustomer("Test customer"), Customer.class).getId(); - String urlTemplate = "/api/customer/" + customerId.getId().toString() + "/entity-views?"; + String urlTemplate = "/api/customer/" + customerId.getId().toString() + "/entityViews?"; String name1 = "Entity view name1"; List namesOfView1 = fillListOf(125, name1, "/api/customer/" + customerId.getId().toString() - + "/entity-view/"); + + "/entityView/"); List loadedNamesOfView1 = loadListOf(new TextPageLink(15, name1), urlTemplate); Collections.sort(namesOfView1, idComparator); Collections.sort(loadedNamesOfView1, idComparator); @@ -221,14 +225,14 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes String name2 = "Entity view name2"; List NamesOfView2 = fillListOf(143, name2, "/api/customer/" + customerId.getId().toString() - + "/entity-view/"); + + "/entityView/"); List loadedNamesOfView2 = loadListOf(new TextPageLink(4, name2), urlTemplate); Collections.sort(NamesOfView2, idComparator); Collections.sort(loadedNamesOfView2, idComparator); Assert.assertEquals(NamesOfView2, loadedNamesOfView2); for (EntityView view : loadedNamesOfView1) { - doDelete("/api/customer/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } TextPageData pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>(){}, new TextPageLink(4, name1)); @@ -236,7 +240,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes Assert.assertEquals(0, pageData.getData().size()); for (EntityView view : loadedNamesOfView2) { - doDelete("/api/customer/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + doDelete("/api/customer/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } pageData = doGetTypedWithPageLink(urlTemplate, new TypeReference>(){}, new TextPageLink(4, name2)); @@ -249,9 +253,9 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes List views = new ArrayList<>(); for (int i = 0; i < 178; i++) { - views.add(doPost("/api/entity-view/", getNewEntityView("Test entity view" + i), EntityView.class)); + views.add(doPost("/api/entityView/", getNewEntityView("Test entity view" + i), EntityView.class)); } - List loadedViews = loadListOf(new TextPageLink(23), "/api/tenant/entity-views?"); + List loadedViews = loadListOf(new TextPageLink(23), "/api/tenant/entityViews?"); Collections.sort(views, idComparator); Collections.sort(loadedViews, idComparator); @@ -263,30 +267,30 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes public void testGetTenantEntityViewsByName() throws Exception { String name1 = "Entity view name1"; List namesOfView1 = fillListOf(143, name1); - List loadedNamesOfView1 = loadListOf(new TextPageLink(15, name1), "/api/tenant/entity-views?"); + List loadedNamesOfView1 = loadListOf(new TextPageLink(15, name1), "/api/tenant/entityViews?"); Collections.sort(namesOfView1, idComparator); Collections.sort(loadedNamesOfView1, idComparator); Assert.assertEquals(namesOfView1, loadedNamesOfView1); String name2 = "Entity view name2"; List NamesOfView2 = fillListOf(75, name2); - List loadedNamesOfView2 = loadListOf(new TextPageLink(4, name2), "/api/tenant/entity-views?"); + List loadedNamesOfView2 = loadListOf(new TextPageLink(4, name2), "/api/tenant/entityViews?"); Collections.sort(NamesOfView2, idComparator); Collections.sort(loadedNamesOfView2, idComparator); Assert.assertEquals(NamesOfView2, loadedNamesOfView2); for (EntityView view : loadedNamesOfView1) { - doDelete("/api/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } - TextPageData pageData = doGetTypedWithPageLink("/api/tenant/entity-views?", + TextPageData pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", new TypeReference>(){}, new TextPageLink(4, name1)); Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(0, pageData.getData().size()); for (EntityView view : loadedNamesOfView2) { - doDelete("/api/entity-view/" + view.getId().getId().toString()).andExpect(status().isOk()); + doDelete("/api/entityView/" + view.getId().getId().toString()).andExpect(status().isOk()); } - pageData = doGetTypedWithPageLink("/api/tenant/entity-views?", new TypeReference>(){}, + pageData = doGetTypedWithPageLink("/api/tenant/entityViews?", new TypeReference>(){}, new TextPageLink(4, name2)); Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(0, pageData.getData().size()); @@ -298,7 +302,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes view.setEntityId(testDevice.getId()); view.setTenantId(savedTenant.getId()); view.setKeys(new TelemetryEntityView(obj)); - return doPost("/api/entity-view", view, EntityView.class); + return doPost("/api/entityView", view, EntityView.class); } private Customer getNewCustomer(String title) { @@ -326,7 +330,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes for (int i = 0; i < limit; i++) { String fullName = partOfName + ' ' + RandomStringUtils.randomAlphanumeric(15); fullName = i % 2 == 0 ? fullName.toLowerCase() : fullName.toUpperCase(); - viewNames.add(doPost("/api/entity-view", getNewEntityView(fullName), EntityView.class)); + viewNames.add(doPost("/api/entityView", getNewEntityView(fullName), EntityView.class)); } return viewNames; } From 7bfccc0f8b09e5d2063f88c9b92f16b84cc2577c Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Mon, 17 Sep 2018 17:27:37 +0300 Subject: [PATCH 06/12] Was fixed cache to pass tests --- .../server/dao/entityview/EntityViewServiceImpl.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) 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 54d8cc9981..c13261c003 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 @@ -51,6 +51,7 @@ import org.thingsboard.server.dao.tenant.TenantDao; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -88,7 +89,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti @Autowired private CacheManager cacheManager; - @Cacheable(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityViewId.getId()}") @Override public EntityView findEntityViewById(EntityViewId entityViewId) { log.trace("Executing findEntityViewById [{}]", entityViewId); @@ -105,7 +105,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti .orElse(null); } - @CacheEvict(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityView.id, #entityView.tenantId, #entityView.name}") + @CacheEvict(cacheNames = ENTITY_VIEW_CACHE, key = "{#entityView.tenantId, #entityView.name}") @Override public EntityView saveEntityView(EntityView entityView) { log.trace("Executing save entity view [{}]", entityView); @@ -173,9 +173,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti validateId(entityViewId, INCORRECT_ENTITY_VIEW_ID + entityViewId); deleteEntityRelations(entityViewId); EntityView entityView = entityViewDao.findById(entityViewId.getId()); - cache.evict(entityView.getId()); - cache.evict(entityView.getTenantId()); - cache.evict(entityView.getName()); + cache.evict(Arrays.asList(entityView.getTenantId(), entityView.getName())); entityViewDao.removeById(entityViewId.getId()); } @@ -310,9 +308,6 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti @Override protected void validateDataImpl(EntityView entityView) { - if (StringUtils.isEmpty(entityView.getKeys().toString())) { - throw new DataValidationException("Entity view type should be specified!"); - } if (StringUtils.isEmpty(entityView.getName())) { throw new DataValidationException("Entity view name should be specified!"); } From 825d7094b303640fa79cbe327fbe53994a9fc68c Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Mon, 17 Sep 2018 17:31:59 +0300 Subject: [PATCH 07/12] Was cleared of unnecessary --- .../org/thingsboard/server/dao/model/ModelConstants.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 a6787d0520..83a89212d6 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 @@ -45,7 +45,6 @@ public class ModelConstants { public static final String SEARCH_TEXT_PROPERTY = "search_text"; public static final String ADDITIONAL_INFO_PROPERTY = "additional_info"; public static final String ENTITY_TYPE_PROPERTY = "entity_type"; - /*public static final String ENTITY_VIEW_ID_PROPERTY = "entity_view_id";*/ public static final String ENTITY_TYPE_COLUMN = ENTITY_TYPE_PROPERTY; public static final String ENTITY_ID_COLUMN = "entity_id"; @@ -53,7 +52,6 @@ public class ModelConstants { public static final String ATTRIBUTE_KEY_COLUMN = "attribute_key"; public static final String LAST_UPDATE_TS_COLUMN = "last_update_ts"; - /** * Cassandra user constants. */ @@ -148,12 +146,11 @@ public class ModelConstants { * Cassandra entityView constants. */ public static final String ENTITY_VIEW_TABLE_FAMILY_NAME = "entity_views"; - public static final String ENTITY_VIEW_FAMILY_NAME = "entity-view"; public static final String ENTITY_VIEW_ENTITY_ID_PROPERTY = ENTITY_ID_COLUMN; 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_TYPE_PROPERTY = DEVICE_TYPE_PROPERTY; + public static final String ENTITY_VIEW_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "entity_view_by_customer_and_search_text"; public static final String ENTITY_VIEW_TENANT_AND_NAME_VIEW_NAME = "entity_view_by_tenant_and_name"; public static final String ENTITY_VIEW_KEYS_PROPERTY = "keys"; public static final String ENTITY_VIEW_START_TS_PROPERTY = "start_ts"; From 72f0d90c90dca06b8f45bcc69595ff1d0349a2bd Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Mon, 17 Sep 2018 17:33:05 +0300 Subject: [PATCH 08/12] Was fixed the last tests --- .../BaseEntityViewControllerTest.java | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) 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 b3da7ad6e2..5c62e6ad13 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseEntityViewControllerTest.java @@ -24,7 +24,6 @@ import org.junit.Before; import org.junit.Test; import org.thingsboard.server.common.data.*; import org.thingsboard.server.common.data.id.CustomerId; -import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.objects.AttributesEntityView; import org.thingsboard.server.common.data.objects.TelemetryEntityView; import org.thingsboard.server.common.data.page.TextPageData; @@ -33,11 +32,9 @@ import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.dao.model.ModelConstants; import java.util.*; -import java.util.stream.Stream; 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.view; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; public abstract class BaseEntityViewControllerTest extends AbstractControllerTest { @@ -54,9 +51,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes idComparator = new IdComparator<>(); - Tenant tenant = new Tenant(); - tenant.setTitle("My tenant"); - savedTenant = doPost("/api/tenant", tenant, Tenant.class); + savedTenant = doPost("/api/tenant", getNewTenant("My tenant"), Tenant.class); Assert.assertNotNull(savedTenant); tenantAdmin = new User(); @@ -119,29 +114,38 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes @Test public void testDeleteEntityView() throws Exception { - EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); + EntityView view = getNewEntityView("Test entity view"); + Customer customer = doPost("/api/customer", getNewCustomer("My customer"), Customer.class); + view.setCustomerId(customer.getId()); + EntityView savedView = doPost("/api/entityView", view, EntityView.class); + doDelete("/api/entityView/" + savedView.getId().getId().toString()) .andExpect(status().isOk()); + doGet("/api/entityView/" + savedView.getId().getId().toString()) .andExpect(status().isNotFound()); } @Test public void testSaveEntityViewWithEmptyName() throws Exception { - doPost("/api/entityView", getNewEntityView("")) + doPost("/api/entityView", new EntityView()) .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Entity-view name should be specified"))); + .andExpect(statusReason(containsString("Entity view name should be specified!"))); } @Test public void testAssignAndUnAssignedEntityViewToCustomer() throws Exception { - EntityView savedView = doPost("/api/entityView", getNewEntityView("Test entity view"), EntityView.class); + EntityView view = getNewEntityView("Test entity view"); Customer savedCustomer = doPost("/api/customer", getNewCustomer("My customer"), Customer.class); - EntityView assignedView = doPost("/api/customer/" + savedCustomer.getId().getId().toString() - + "/entityView/" + savedView.getId().getId().toString(), EntityView.class); + view.setCustomerId(savedCustomer.getId()); + EntityView savedView = doPost("/api/entityView", view, EntityView.class); + + EntityView assignedView = doPost( + "/api/customer/" + savedCustomer.getId().getId().toString() + "/entityView/" + savedView.getId().getId().toString(), + EntityView.class); Assert.assertEquals(savedCustomer.getId(), assignedView.getCustomerId()); - EntityView foundView = doGet("/api/entityView" + savedView.getId().getId().toString(), EntityView.class); + EntityView foundView = doGet("/api/entityView/" + savedView.getId().getId().toString(), EntityView.class); Assert.assertEquals(savedCustomer.getId(), foundView.getCustomerId()); EntityView unAssignedView = doDelete("/api/customer/entityView/" + savedView.getId().getId().toString(), EntityView.class); @@ -172,7 +176,7 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes tenantAdmin2.setEmail("tenant3@thingsboard.org"); tenantAdmin2.setFirstName("Joe"); tenantAdmin2.setLastName("Downs"); - tenantAdmin2 = createUserAndLogin(tenantAdmin2, "testPassword1"); + createUserAndLogin(tenantAdmin2, "testPassword1"); Customer customer = getNewCustomer("Different customer"); Customer savedCustomer = doPost("/api/customer", customer, Customer.class); @@ -298,9 +302,9 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes private EntityView getNewEntityView(String name) throws Exception { EntityView view = new EntityView(); - view.setName(name); view.setEntityId(testDevice.getId()); view.setTenantId(savedTenant.getId()); + view.setName(name); view.setKeys(new TelemetryEntityView(obj)); return doPost("/api/entityView", view, EntityView.class); } @@ -330,7 +334,10 @@ public abstract class BaseEntityViewControllerTest extends AbstractControllerTes for (int i = 0; i < limit; i++) { String fullName = partOfName + ' ' + RandomStringUtils.randomAlphanumeric(15); fullName = i % 2 == 0 ? fullName.toLowerCase() : fullName.toUpperCase(); - viewNames.add(doPost("/api/entityView", getNewEntityView(fullName), EntityView.class)); + EntityView view = getNewEntityView(fullName); + Customer customer = getNewCustomer("Test customer " + String.valueOf(Math.random())); + view.setCustomerId(doPost("/api/customer", customer, Customer.class).getId()); + viewNames.add(doPost("/api/entityView", view, EntityView.class)); } return viewNames; } From 9237a5dda9aa2cc5202efb58b73c0117aa3ae9b5 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Mon, 17 Sep 2018 17:43:42 +0300 Subject: [PATCH 09/12] Was deleted unnecessesary lines --- .../server/controller/EntityViewController.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java index b5adc327f5..26a48daff6 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java @@ -15,32 +15,28 @@ */ package org.thingsboard.server.controller; -import com.google.common.util.concurrent.ListenableFuture; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.thingsboard.server.common.data.Customer; -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.audit.ActionType; import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.CustomerId; -import org.thingsboard.server.common.data.id.DeviceId; 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; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.model.ModelConstants; -import org.thingsboard.server.service.security.model.SecurityUser; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import static org.thingsboard.server.controller.CustomerController.CUSTOMER_ID; + /** * Created by Victor Basanets on 8/28/2017. */ @@ -109,9 +105,9 @@ public class EntityViewController extends BaseController { @PreAuthorize("hasAuthority('TENANT_ADMIN')") @RequestMapping(value = "/customer/{customerId}/entityView/{entityViewId}", method = RequestMethod.POST) @ResponseBody - public EntityView assignEntityViewToCustomer(@PathVariable("customerId") String strCustomerId, + public EntityView assignEntityViewToCustomer(@PathVariable(CUSTOMER_ID) String strCustomerId, @PathVariable(ENTITY_VIEW_ID) String strEntityViewId) throws ThingsboardException { - checkParameter("customerId", strCustomerId); + checkParameter(CUSTOMER_ID, strCustomerId); checkParameter(ENTITY_VIEW_ID, strEntityViewId); try { CustomerId customerId = new CustomerId(toUUID(strCustomerId)); From 77de5522af9eaab7a6e3a60e0d504f3a8b04aac5 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Mon, 17 Sep 2018 19:54:34 +0300 Subject: [PATCH 10/12] Were fixed materialized views --- .../main/data/upgrade/2.1.1/schema_update.cql | 105 +++++++----------- dao/src/main/resources/cassandra/schema.cql | 31 ++++-- 2 files changed, 61 insertions(+), 75 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 e0cff4108f..c5d919bc7c 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 @@ -22,72 +22,51 @@ DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_customer DROP TABLE IF EXISTS thingsboard.entity_views; CREATE TABLE IF NOT EXISTS thingsboard.entity_views ( - id timeuuid, - entity_id timeuuid, - entity_type text, - tenant_id timeuuid, - customer_id timeuuid, - name text, - keys text, - start_ts bigint, - end_ts bigint, - search_text text, - additional_info text, - PRIMARY KEY (id, entity_id, tenant_id, customer_id) +id timeuuid, +entity_id timeuuid, +entity_type text, +tenant_id timeuuid, +customer_id timeuuid, +name text, +keys text, +start_ts bigint, +end_ts bigint, +search_text text, +additional_info text, +PRIMARY KEY (id, tenant_id, customer_id) ); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_name AS - SELECT * - from thingsboard.entity_views - WHERE entity_id IS NOT NULL - AND tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND keys IS NOT NULL - AND start_ts IS NOT NULL - AND end_ts IS NOT NULL - AND name IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, name, id, entity_id, customer_id) - WITH CLUSTERING ORDER BY (name ASC, id DESC, entity_id DESC, customer_id DESC); +SELECT * +from thingsboard.entity_views +WHERE entity_id IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL +PRIMARY KEY (tenant_id, name, id, entity_id, customer_id) +WITH CLUSTERING ORDER BY (name ASC, id DESC, entity_id DESC, customer_id DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_entity AS - SELECT * - from thingsboard.entity_views - WHERE entity_id IS NOT NULL - AND tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND keys IS NOT NULL - AND start_ts IS NOT NULL - AND end_ts IS NOT NULL - AND name IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, entity_id, id, customer_id, name) - WITH CLUSTERING ORDER BY (entity_id ASC, customer_id ASC, id DESC, name DESC); +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_search_text AS +SELECT * +from thingsboard.entity_views +WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL +PRIMARY KEY (tenant_id, search_text, id, customer_id, name) +WITH CLUSTERING ORDER BY (search_text ASC, customer_id ASC, id DESC, name DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer AS - SELECT * - from thingsboard.entity_views - WHERE entity_id IS NOT NULL - AND tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND keys IS NOT NULL - AND start_ts IS NOT NULL - AND end_ts IS NOT NULL - AND name IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, id, entity_id, name) - WITH CLUSTERING ORDER BY (customer_id ASC, id DESC, entity_id DESC, name DESC); +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_entity_and_search_text AS +SELECT * +from thingsboard.entity_views +WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL +PRIMARY KEY (tenant_id, entity_id, search_text, id, customer_id, name) +WITH CLUSTERING ORDER BY (entity_id ASC, search_text ASC, id DESC, name DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity AS - SELECT * - from thingsboard.entity_views - WHERE entity_id IS NOT NULL - AND tenant_id IS NOT NULL - AND customer_id IS NOT NULL - AND keys IS NOT NULL - AND start_ts IS NOT NULL - AND end_ts IS NOT NULL - AND name IS NOT NULL - AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, entity_id, id, name) - WITH CLUSTERING ORDER BY (customer_id ASC, entity_id DESC, id DESC, name DESC); +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_search_text AS +SELECT * +from thingsboard.entity_views +WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL +PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) +WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, id DESC, entity_id DESC); + +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity_and_search_text AS +SELECT * +from thingsboard.entity_views +WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL +PRIMARY KEY (tenant_id, customer_id, search_text,entity_id, id) +WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, entity_id DESC, id DESC); diff --git a/dao/src/main/resources/cassandra/schema.cql b/dao/src/main/resources/cassandra/schema.cql index 3cefacb970..674d30e824 100644 --- a/dao/src/main/resources/cassandra/schema.cql +++ b/dao/src/main/resources/cassandra/schema.cql @@ -661,23 +661,30 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_na PRIMARY KEY (tenant_id, name, id, entity_id, customer_id) WITH CLUSTERING ORDER BY (name ASC, id DESC, entity_id DESC, customer_id DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_entity AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_search_text AS SELECT * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, entity_id, id, customer_id, name) - WITH CLUSTERING ORDER BY (entity_id ASC, customer_id ASC, id DESC, name DESC); + WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL + PRIMARY KEY (tenant_id, search_text, id, customer_id, name) + WITH CLUSTERING ORDER BY (search_text ASC, customer_id ASC, id DESC, name 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_entity_and_search_text AS SELECT * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, id, entity_id, name) - WITH CLUSTERING ORDER BY (customer_id ASC, id DESC, entity_id DESC, name DESC); + WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL + PRIMARY KEY (tenant_id, entity_id, search_text, id, customer_id, name) + WITH CLUSTERING ORDER BY (entity_id ASC, search_text ASC, id DESC, name DESC); -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_search_text AS SELECT * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, entity_id, id, name) - WITH CLUSTERING ORDER BY (customer_id ASC, entity_id DESC, id DESC, name DESC); + WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL + PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) + WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, id DESC, entity_id DESC); + +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity_and_search_text AS + SELECT * + from thingsboard.entity_views + WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL + PRIMARY KEY (tenant_id, customer_id, search_text,entity_id, id) + WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, entity_id DESC, id DESC); From d3ba64683c53c81c341976cb993f37e7bf354fd6 Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Mon, 17 Sep 2018 19:56:17 +0300 Subject: [PATCH 11/12] Were added all necessary methods --- .../entityview/CassandraEntityViewDao.java | 68 +++++++++++++------ .../server/dao/model/ModelConstants.java | 6 +- 2 files changed, 51 insertions(+), 23 deletions(-) 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 5de34e4b71..98f6105646 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 @@ -67,49 +67,75 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao findEntityViewByTenantId(UUID tenantId, TextPageLink pageLink) { - log.debug("Try to find entity-views by tenantId [{}] and pageLink [{}]", tenantId, pageLink); + log.debug("Try to find entity views by tenantId [{}] and pageLink [{}]", tenantId, pageLink); List entityViewEntities = findPageWithTextSearch(ENTITY_VIEW_BY_TENANT_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, - Collections.singletonList(eq(ENTITY_VIEW_TENANT_ID_PROPERTY, tenantId)), pageLink); - - log.trace("Found entity-views [{}] by tenantId [{}] and pageLink [{}]", entityViewEntities, tenantId, pageLink); + Collections.singletonList(eq(TENANT_ID_PROPERTY, tenantId)), pageLink); + log.trace("Found entity views [{}] by tenantId [{}] and pageLink [{}]", + entityViewEntities, tenantId, pageLink); return DaoUtil.convertDataList(entityViewEntities); } @Override - public Optional findEntityViewByTenantIdAndName(UUID tenantId, String entityViewName) { - return Optional.ofNullable(DaoUtil.getData( - findOneByStatement(select().from(ENTITY_VIEW_TENANT_AND_NAME_VIEW_NAME).where() - .and(eq(ENTITY_VIEW_TENANT_ID_PROPERTY, tenantId)) - .and(eq(ENTITY_VIEW_NAME_PROPERTY, entityViewName)))) - ); + public Optional findEntityViewByTenantIdAndName(UUID tenantId, String name) { + Select.Where query = select().from(ENTITY_VIEW_BY_TENANT_AND_NAME).where(); + query.and(eq(ENTITY_VIEW_TENANT_ID_PROPERTY, tenantId)); + query.and(eq(ENTITY_VIEW_NAME_PROPERTY, name)); + return Optional.ofNullable(DaoUtil.getData(findOneByStatement(query))); } @Override public List 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(DEVICE_BY_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, - Arrays.asList(eq(DEVICE_CUSTOMER_ID_PROPERTY, entityId), - eq(DEVICE_TENANT_ID_PROPERTY, tenantId)), + 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); + 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) { - return null; + log.debug("Try to find entity views by tenantId [{}], customerId[{}] and pageLink [{}]", + tenantId, customerId, pageLink); + List entityViewEntities = findPageWithTextSearch( + ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_SEARCH_TEXT, + Arrays.asList(eq(CUSTOMER_ID_PROPERTY, customerId), eq(TENANT_ID_PROPERTY, tenantId)), + pageLink); + log.trace("Found find entity views [{}] by tenantId [{}], customerId [{}] and pageLink [{}]", + entityViewEntities, tenantId, customerId, pageLink); + return DaoUtil.convertDataList(entityViewEntities); } @Override - public List findEntityViewsByTenantIdAndCustomerIdAndEntityId(UUID tenantId, UUID customerId, UUID entityId, TextPageLink pageLink) { - return null; + public List 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) { - // TODO: implement this - return null; + log.debug("Try to find entity views by tenantId [{}] and entityId [{}]", tenantId, entityId); + Select.Where query = select().from(getColumnFamilyName()).where(); + query.and(eq(TENANT_ID_PROPERTY, tenantId)); + query.and(eq(ENTITY_ID_COLUMN, entityId)); + return findListByStatementAsync(query); } } 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 83a89212d6..da180af3a9 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,13 +150,15 @@ 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_CUSTOMER_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME = "entity_view_by_customer_and_search_text"; - public static final String ENTITY_VIEW_TENANT_AND_NAME_VIEW_NAME = "entity_view_by_tenant_and_name"; + public static final String ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_ENTITY_AND_SEARCH_TEXT = "entity_views_by_tenant_and_customer_and_entity_and_search_text"; + public static final String ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_SEARCH_TEXT = "entity_views_by_tenant_and_customer_and_search_text"; 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_and_search_text"; /** * Cassandra audit log constants. From 1e6bd5513089a2e3c3b3aaf1de5c2d282a512ffe Mon Sep 17 00:00:00 2001 From: viktorbasanets Date: Tue, 18 Sep 2018 15:33:37 +0300 Subject: [PATCH 12/12] Was fixed Materialized View --- .../main/data/upgrade/2.1.1/schema_update.cql | 100 +++++++++++------- .../server/dao/model/ModelConstants.java | 6 +- dao/src/main/resources/cassandra/schema.cql | 90 +++++++++++----- 3 files changed, 128 insertions(+), 68 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 c5d919bc7c..888f43c5ad 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 @@ -22,51 +22,71 @@ DROP MATERIALIZED VIEW IF EXISTS thingsboard.entity_views_by_tenant_and_customer DROP TABLE IF EXISTS thingsboard.entity_views; CREATE TABLE IF NOT EXISTS thingsboard.entity_views ( -id timeuuid, -entity_id timeuuid, -entity_type text, -tenant_id timeuuid, -customer_id timeuuid, -name text, -keys text, -start_ts bigint, -end_ts bigint, -search_text text, -additional_info text, -PRIMARY KEY (id, tenant_id, customer_id) + id timeuuid, + entity_id timeuuid, + entity_type text, + tenant_id timeuuid, + customer_id timeuuid, + name text, + keys text, + start_ts bigint, + end_ts bigint, + search_text text, + additional_info text, + PRIMARY KEY (id, entity_id, tenant_id, customer_id) ); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_name AS -SELECT * -from thingsboard.entity_views -WHERE entity_id IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL -PRIMARY KEY (tenant_id, name, id, entity_id, customer_id) -WITH CLUSTERING ORDER BY (name ASC, id DESC, entity_id DESC, customer_id DESC); + SELECT * + from thingsboard.entity_views + WHERE tenant_id IS NOT NULL + AND entity_id IS NOT NULL + AND customer_id IS NOT NULL + AND name IS NOT NULL + AND id IS NOT NULL + PRIMARY KEY (tenant_id, name, id, customer_id, entity_id) + WITH CLUSTERING ORDER BY (name ASC, id DESC, customer_id DESC); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_search_text AS -SELECT * -from thingsboard.entity_views -WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL -PRIMARY KEY (tenant_id, search_text, id, customer_id, name) -WITH CLUSTERING ORDER BY (search_text ASC, customer_id ASC, id DESC, name DESC); + SELECT * + from thingsboard.entity_views + WHERE tenant_id IS NOT NULL + AND entity_id IS NOT NULL + AND customer_id IS NOT NULL + AND search_text IS NOT NULL + AND id IS NOT NULL + 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_and_search_text AS -SELECT * -from thingsboard.entity_views -WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL -PRIMARY KEY (tenant_id, entity_id, search_text, id, customer_id, name) -WITH CLUSTERING ORDER BY (entity_id ASC, search_text ASC, id DESC, name 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_and_search_text AS -SELECT * -from thingsboard.entity_views -WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL -PRIMARY KEY (tenant_id, customer_id, search_text, id, entity_id) -WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, id DESC, entity_id DESC); +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_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, 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_and_search_text AS -SELECT * -from thingsboard.entity_views -WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL -PRIMARY KEY (tenant_id, customer_id, search_text,entity_id, id) -WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, entity_id DESC, 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/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index da180af3a9..45d0ff9493 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,15 @@ 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_and_search_text"; - public static final String ENTITY_VIEW_BY_TENANT_AND_CUSTOMER_AND_SEARCH_TEXT = "entity_views_by_tenant_and_customer_and_search_text"; + 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_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_and_search_text"; + public static final String ENTITY_VIEW_BY_TENANT_AND_ENTITY_AND_SEARCH_TEXT = "entity_view_by_tenant_and_entity"; /** * Cassandra audit log constants. diff --git a/dao/src/main/resources/cassandra/schema.cql b/dao/src/main/resources/cassandra/schema.cql index 674d30e824..4645420eb8 100644 --- a/dao/src/main/resources/cassandra/schema.cql +++ b/dao/src/main/resources/cassandra/schema.cql @@ -165,35 +165,55 @@ CREATE TABLE IF NOT EXISTS thingsboard.device ( CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.device_by_tenant_and_name AS SELECT * from thingsboard.device - WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL + WHERE tenant_id IS NOT NULL + AND customer_id IS NOT NULL + AND type IS NOT NULL + AND name IS NOT NULL + AND id IS NOT NULL PRIMARY KEY ( tenant_id, name, id, customer_id, type) WITH CLUSTERING ORDER BY ( name ASC, id DESC, customer_id DESC); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.device_by_tenant_and_search_text AS SELECT * from thingsboard.device - WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL + WHERE tenant_id IS NOT NULL + AND customer_id IS NOT NULL + AND type IS NOT NULL + AND search_text IS NOT NULL + AND id IS NOT NULL PRIMARY KEY ( tenant_id, search_text, id, customer_id, type) WITH CLUSTERING ORDER BY ( search_text ASC, id DESC, customer_id DESC); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.device_by_tenant_by_type_and_search_text AS SELECT * from thingsboard.device - WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL + WHERE tenant_id IS NOT NULL + AND customer_id IS NOT NULL + AND type IS NOT NULL + AND search_text IS NOT NULL + AND id IS NOT NULL PRIMARY KEY ( tenant_id, type, search_text, id, customer_id) WITH CLUSTERING ORDER BY ( type ASC, search_text ASC, id DESC, customer_id DESC); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.device_by_customer_and_search_text AS SELECT * from thingsboard.device - WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL + WHERE tenant_id IS NOT NULL + AND customer_id IS NOT NULL + AND type IS NOT NULL + AND search_text IS NOT NULL + AND id IS NOT NULL PRIMARY KEY ( customer_id, tenant_id, search_text, id, type ) WITH CLUSTERING ORDER BY ( tenant_id DESC, search_text ASC, id DESC ); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.device_by_customer_by_type_and_search_text AS SELECT * from thingsboard.device - WHERE tenant_id IS NOT NULL AND customer_id IS NOT NULL AND type IS NOT NULL AND search_text IS NOT NULL AND id IS NOT NULL + WHERE tenant_id IS NOT NULL + AND customer_id IS NOT NULL + AND type IS NOT NULL + AND search_text IS NOT NULL + AND id IS NOT NULL PRIMARY KEY ( customer_id, tenant_id, type, search_text, id ) WITH CLUSTERING ORDER BY ( tenant_id DESC, type ASC, search_text ASC, id DESC ); @@ -651,40 +671,60 @@ CREATE TABLE IF NOT EXISTS thingsboard.entity_views ( end_ts bigint, search_text text, additional_info text, - PRIMARY KEY (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 SELECT * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, name, id, entity_id, customer_id) - WITH CLUSTERING ORDER BY (name ASC, id DESC, entity_id DESC, customer_id DESC); + WHERE tenant_id IS NOT NULL + AND entity_id IS NOT NULL + AND customer_id IS NOT NULL + AND name IS NOT NULL + AND id IS NOT NULL + PRIMARY KEY (tenant_id, name, id, customer_id, entity_id) + WITH CLUSTERING ORDER BY (name ASC, id DESC, customer_id DESC); CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_search_text AS SELECT * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, search_text, id, customer_id, name) - WITH CLUSTERING ORDER BY (search_text ASC, customer_id ASC, id DESC, name DESC); - -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_view_by_tenant_and_entity_and_search_text AS + WHERE tenant_id IS NOT NULL + AND entity_id IS NOT NULL + AND customer_id IS NOT NULL + AND search_text IS NOT NULL + AND id IS NOT NULL + 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 entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, entity_id, search_text, id, customer_id, name) - WITH CLUSTERING ORDER BY (entity_id ASC, search_text ASC, id DESC, name DESC); - -CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_search_text AS + 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 * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL + 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, search_text, id, entity_id) - WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, id DESC, entity_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_and_search_text AS +CREATE MATERIALIZED VIEW IF NOT EXISTS thingsboard.entity_views_by_tenant_and_customer_and_entity AS SELECT * from thingsboard.entity_views - WHERE entity_id IS NOT NULL AND search_text IS NOT NULL AND tenant_id IS NOT NULL AND customer_id IS NOT NULL AND keys IS NOT NULL AND start_ts IS NOT NULL AND end_ts IS NOT NULL AND name IS NOT NULL AND id IS NOT NULL - PRIMARY KEY (tenant_id, customer_id, search_text,entity_id, id) - WITH CLUSTERING ORDER BY (customer_id ASC, search_text ASC, entity_id DESC, id DESC); + 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);